1. IDA로 pseudo code 확인
- echo 함수에서 gets 함수로 s 변수에 저장된 문자열을 출력 -> overflow 발생시켜 return address 덮을 수 있음
- s 변수의 주소 출력 -> 이 출력된 변수를 따로 다른 변수에 저장해서 return address를 이 주소로 덮는다.
- s 변수 + SFP에는 NOP + shellcode + NOP 으로 채운다.
2. 보호기법 확인
신경쓸만한 보호기법 X
3. s 변수에서 return address 까지 거리
bp 1 : echo 함수 첫 번째 명령어 - return address 값 가지고 있는 최상위 stack 주소
bp 2 : gets 함수 호출 명령어(gets 함수 호출 전) - gets 함수 호출 전 인자 구성 시 push eax -> eax 확인
- buf 변수 주소
(bp 1 에서 구한 주소) - (bp 2 에서 구한 주소) = s 에서 return address 까지 거리 = 242
따라서 아까 pseudo code를 확인해보면 ebp-EEh가 나와있는데 이건 s 변수의 크기이다.
s 변수의 크기가 0xEE = 238 바이트이므로 s(238) + SFP(4) = 242 로 dummy는 없다.
4. payload
위와 같이 payload를 작성했을 때는 EOF를 전달받았다.
어떻게 써야할지 생각해봤는데, 일단 NOP + shellcode + NOP으로 shellcode를 감싸줘서 nop sled로 제대로 원하는 주소로 갈 수 있도록 하고, len 함수로 shellcode 길이 구할 때가 잘못됐나해서 확인해봤다.
그냥 shellcraft.sh()를 한 것을 len에 넣으면 안 되고,
asm 함수로 assembly code 변환 후의 shellcode를 넣어야 했다.
그리고 s 변수의 주소를 받아올 때 p.recvuntil("!\n") 나 p.recv(10)을 사용했을 때 계속 오류가 생겨서 pwntools를 다시 확인해봤다.
딱 10 바이트만 받고 싶은 거니까 recvn 함수를 사용하면 될 것 같아서 p.recvn(10)으로 썼다.
최종 expoit 코드는 다음과 같다.
(코드는 길어지지만 shellcraft.nop()으로 NOP을 쓸 수도 있어서 한 번 사용해봤다.)
5. exploit
[HITCON-Training] lab5 : simplerop (0) | 2019.08.15 |
---|---|
[TAMU 2019] pwn2 (0) | 2019.08.14 |
[TAMU 2019] pwn1 (0) | 2019.08.14 |
[TAMU 2018] pwn4 (0) | 2019.08.10 |
[HITCON-Training] lab3 : ret2sc (0) | 2019.08.10 |