목록FTZ (13)
ii4gsp
힌트파일을 보면 level14문제에서 보았던 check변수를 포인터로 바뀐것을 알 수 있다. 포인터 변수는 메모리의 주소 값을 저장하는 변수이기 때문에 check변수에 들어가는 값은 메모리 주소의 값이 저장된다. - 0xffffffc8은 ebp-56이다. - 0xfffffff0은 ebp-16이다. 따라서 buf에서 *check까지의 거리는 56 - 16 = 40 40byte라는 빈공간을 채워줘야 할 것이다. - 0xdeadbeef와 *check 포인터가 값을 비교한다. 메모리 상에서 0xdeadbeef의 주소를 알아내 *check의 주소를 0xdeadbeef의 주소로 덮어 씌우면 쉘이 실행될 것이다. 0x080484b2가 0xdeadbeef의 메모리 상의 주소이다. 이제 페이로드를 작성할 수 있을 것이다..
힌트파일을 보니 i가 0x1234567이 아니라면 프로그램이 죽어버린다. 변수 i가 buf보다 먼저 선언되었으므로 i의 시작주소가 buf의 시작주소보다 높은 것을 알 수 있다. gdb로 attackme파일을 열고 disas main을 해주고 은 0x418byte만큼 빼주고 0x418은 10진수로 1048이다. buf가 1024byte이고 long i가 4byte이니 dummy는 20byte이다. 에서 fffffbe8을 2진수로 1011 1110 1000인데 1의 보수를 구해주면 0100 0001 0111인데 2의 보수를 해주면 + 1이 되기때문에 10진수로 1048이 된다 buf에서 ebp까지의 거리는 1048byte이다. ebp와 ret의 거리는 4byte차이기 때문에 buf에서 ret까지의 거리는 1..
힌트 파일을열어 보니 소스코드가 주어지는데 이전에 풀었던 level11과 strcpy()함수가 아닌 gets()함수로 바뀐것빼고는 유형이 같다. gdb로 attackme파일을 열어 disas main을 하고 부분에서 0xfffffef8은 2진수로 1110 1111 1000인데 1의 보수를 구하면 0001 0000 0111이되고 2의 보수를 구해주면 +1이 되기때문에 264가 된다. str에서 ebp까지의 거리는 264byte라는것을 알 수 있다. ret는 ebp의 4byte 아래에 위치함으로 268byte다. export shellcode=$(python -c 'print "\x90" * 20 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe..
힌트를 보니 소스코드만 던져주었다. 디버깅을 하기위해 cp attackme /tmp명령어로 tmp폴더로 attackme파일을 복사해주고 gdb로 attackme를 열고 disas main을 해주면 str은 256바이트를 할당해주었는데 8바이트 dummy가 추가로 붙은것을 알수있다. 10진수 256은 16진수 0x100이다 과 부분을 보면 0xfffffef8은 2진수로 1110 1111 1000인데 1의 보수를 구하면 0001 0000 0111이되고 2의 보수를 구해주면 +1이 되기때문에 264가 된다 ebp-264부터 입력값을 받는 것을 알 수 있다. ebp-264에 argv[1]을 덮어쓰는 작업을 하고 난 후인 *main+53에 break point를 걸고 ret에 넣을 주소를 구해보려한다. 243by..
힌트를 보니 /usr/bin/bof의 소스코드를 보여주고 level10의 권한을 얻으라고 한다. fgets함수에서 버퍼 오버플로우 취약점이 발생한다. buf가 10칸 할당받았는데 fgets에서 40만큼 입력을받기때문에 buf공간이 넘쳐 buf2영역까지 인자를 전달하여 buf2의 첫 두글자가 go가 되게하면 쉘을 획득 할수있을것이다. hint의 소스코드를 /tmp 디렉토리에 bof.c라고 저장하였다. 저장된 bof.c를 vi 에디터로 열어 한글을 제거하였다. gcc로 컴파일해주고 gdb로 disas main 명령어를 실행해보니 0xffffffd8은 1101 1000에서 1의 보수를 해주면 0010 0111(39)이 되는데 2의 보수로인해 +1이 됨으로써 40이된다. [ebp-40] 만큼 문자열을 입력받는다..