pwn学习-简单exp的编写

不太喜欢写博客,水平有限见谅。

 

记录一些关于pwntools的简单用法

exp是exploit的简写,可不是experience。

 

0x00.  下载pwntools:

现在需要sudo pip install pwntools就可以了(linux环境下,且环境应该是2.7)

安装好之后你就也拥有了checksec 查看当前ELF文件的保护情况

以及ROPgadget 可以从文件中搜索你需要的gadget(ROP的时候需要)。

 

0x01.  编写一个exp的基本框架:

 

from pwn import *

DEBUG  # 自己设定值 在本地调试还是远程利用 当然这只是一种相对规范的写法,不写也无所谓

if DEBUG:

    p = process(bin路径)  # 在本地调试

else:

    p = remote(ip, port)  # 连接其他主机的服务 需要输入对应的ip地址和端口号

...  # 输入payload来进行操作以拿到程序的shell

p.interactive()  # 反弹shell

 

0x02. io交互:

形式都是str类型

recv():接受收到的所有字符

recvuntil(str):接收到第一次出现str的内容为止

recvline():接受一行

send(str):发送str的内容,

sendline(str):发送str的内容并加上回车("\n")发送,推荐优先于send

当不确定自己的io内容时,可以在exp开头加上context.log_level = "debug" 帮助调试

有时候可能会因为缓冲区的问题阻塞一部分数据,有时加上sleep调整可能会得到改善

 

0x03.打包解包数据:

这里就不详细介绍了,其目的就是为了把我们理解的数据转化成机器需要的数据形式

总之是大端序和小端序的问题,想了解可以去了解一下

打包数据可以一般常用p64() 和 p32() ,分别对应32位和64位的ELF,当然也有p8等这种不常见的操作。

解包数据则对应为u64() 和 u32()

 

0x04.bin文件的操作:

常用的形式有:

elf = ELF("binfilepath")

libc = ELF("libcpath")

这样我们就可以得到里面的一些信息,比如说PLT和GOT这些

得到程序bss段的起始位置:bss_base_addr = elf.bss()

PLT:例如:write_plt = elf.plt["write"]

GOT:例如:write_plt = elf.got["write"]

当然,上述这些都是在系统ASLR关闭的情况下才可以找得到的,否则只会得到一个偏移量

现在好像还加入了自带的自动化的rop链方法,不过我不会用

 

0x05.其他:

DynELF函数:

无libc情况下泄露某些地址,这个文章说的很详细了,当然推荐你需要的时候再看就好

https://www.anquanke.com/post/id/85129 

LibcSearch模块:

安装以及使用方法:

https://github.com/lieanu/LibcSearcher

gdb.attach():

一个方便我们调试的方法,我用的也不是特别好而且我的这个函数就有点问题......

不过,栈溢出题目IDA足够了。

 

其他的想到再继续补充......

你可能感兴趣的:(CTF)