목록Wargame/HackCTF (37)
Pwnstar
음...우연히도 내가 96년생인데...아무튼 이 문제는 64비트 바이너리이고 NX bit만 걸려있다. IDA로 우선 보자 int __cdecl main(int argc, const char **argv, const char **envp) { __int64 v3; // rdx __int64 v4; // rax __int64 v5; // rdx __int64 v6; // rbx char *v7; // rax __int64 v8; // rdx __int64 v9; // rax char name; // [rsp+0h] [rbp-410h] std::operator(&std::cin, &name); v4 = std::operator
시 라는 문제이다. 64비트 바이너리이고 NX bit만 걸려있다. IDA int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { const char *v3; // rdi setvbuf(_bss_start, 0LL, 2, 0LL); v3 = s; puts(s); while ( 1 ) { get_poem(v3, 0LL); get_author(v3); rate_poem(v3); if ( dword_6024E0 == 1000000 ) break; v3 = asc_400D78; puts(asc_400D78); } reward(v3); } 여기서 볼 부분은 rate_poem 함수이다. 이 함수를 보면 int rate_poem() {..
g++ pwn이라는 문제이다. 32비트 바이너리이고 NX bit만 걸려있다. 메인함수는 vuln 함수를 호출한다. vuln 함수를 보자. 중간에 you 와 I 문자열이 있는 곳을 보면 you나 I를 입력하면 뭔가 다른 값이 나오는게 아닐까 싶다. (아직 c++ 바이너리 보는 방법을 잘 몰라 코드 분석이 완벽하지 않다ㅠㅠ) youyouyou라고 입력을 해 줬는데 그대로이다... I를 입력해보자. 오 IIIII를 입력해줬더니 I가 you로 바뀌었다. 이 점을 이용하면 될 것 같다. 입력받을 수 있는 s의 크기는 60바이트인데 fgets로 32바이트밖에 입력받지 않는다. I가 you로 바뀌는 것을 이용해 overflow를 일으키고 요 함수로 eip를 덮어주면 될 것이다. I가 you로 바뀌니까 I를 21바이트..
이전에 풀어놓고 쓰지 않았던 라업들을 계속 작성해보려고 한다. 쉽게 풀었던 문제도 확실히 각인시키기 위해 라업을 최대한 자세히 써야겠다. 문제의 이름은 rtl_world 32비트 바이너리이고, NX bit가 걸려있어 쉘코드의 실행이 불가능하다. 아이다로 본 메인함수는 다음과 같다. int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // [esp+10h] [ebp-90h] char buf; // [esp+14h] [ebp-8Ch] void *v6; // [esp+94h] [ebp-Ch] void *handle; // [esp+98h] [ebp-8h] void *s1; // [esp+9Ch]..
child fsb보다 딱히 더 어렵진 않았다. dreamhack에서 풀어봤던 문제들이 도움이 많이 되었던 것 같다. Full RELRO가 걸려있어 got overwrite가 불가능하고, nx 때문에 쉘코드도 사용이 불가능하다. 메인함수를 보면 두 번에 걸쳐 입력을 받는데 fsb를 이용하여 libc를 leak한 후 덮을 수 있는 부분을 찾아야했다. Full RELRO인데 어떻게 덮느냐...그것이 문제인데 dreamhack의 rtld 문제를 풀어봤던 것이 큰 도움이 되었다. main함수를 보면 exit함수로 종료를 하는데, exit 함수 내부 로직 중 덮어 쓸 수 있는 부분이 있다. exit 함수는 run_exit_handlers 함수를 호출한다. 그 함수는 ld.so에 존재하는 _di_fini 함수를 호출..
오랜만에 핵시텦 문제 라업을 써 보려고 한다. 그동안에도 몇 문제 풀긴 했는데, 일단 가장 최근에 푼 문제부터 작성하겠다. baby도 baby가 아니었는데 얘는 한 술 더 뜨겠지 싶은 문제였다. 근데 막상 풀어보니 크게 어려운 문제는 아니었다. 우선 IDA로 보면 입력을 0x19(25)바이트밖에 받지 않는다. 그래서 stack_chk_fail 함수를 덮어씌워서 다시 main으로 돌아와 계속 입력을 받는 방식으로 해야겠다고 생각했다. stack_chk_fail got를 main의 mov rbp,rsp 부분으로 덮으면 stack_chk_fail로 덮어도 스택이 유지되도록(입력받은 값들이 유지되도록) 할 수 있다. 이렇게 입력하고 실행해보니 입력을 또 받을 수 있다는 것을 확인했고, 이제 libc를 leak하..
definit ctf의 여러 문제들을 시도해보고 아무것도 풀지 못했다. 그 중에서 힙 문제들도 있었는데 공부를 좀 하기 위해서 이전에 풀었던 힙 문제들의 라이트업을 먼저 작성하려고 한다. 보호기법은 NX만 걸려있다. IDA 메인함수는 이렇게 되어있는데, fgets함수로 입력을 받고 strcpy로 복사하는 과정이 두번 연속 있다. 이렇게 보면 단순한 heap overflow같아 보인다. gdb로 보자. strcpy를 호출한 직후의 모습이다. 아마 입력을 4096만큼 받으니 저 부분을 전부 덮을 수도 있을 것이다. A를 8바이트 입력하고 난 후의 모습인데 A가 복사된 곳에 B가 덮어쓰여졌다. 잘 보면 +40의 위치에 0x602070의 주소가 있고 그 부분에는 두번째 strcpy한 값이 들어있다. 이걸 이용해..
풀고 한참이 지나고 나서야 정석적인 풀이 방법을 알게 된 문제이다. mitigation은 partial relro와 NX만 걸려있다. Got overwrite가 가능하고 쉘코드는 넣을 수 없다. 개인적으로 참 어려운 문제였고, 이 다음 문제인 RTC도 정석대로 풀지는 않았지만 이 문제보다 더 어려웠다. 우선 sysrop.zip을 다운받아 압축을 풀면 libc 하나와 바이너리 하나가 있다. 메인 함수는 간단하게 구성되어있다. buf의 크기는 0x10(16)바이트이고, 24바이트 이후에 입력하는 8바이트로 rip를 조작할 수 있다. 처음에 sysrop라는 것을 모르고(지금도 잘 모르지만) 문제 형태도 unexploitable과 비슷하여 rop로 풀려고 접근했다. 문제는 0x78(120)바이트의 공간이 부족하..