[huayang]
pwntools
连接本地(process)
p = process('./stack')
连接远程(remote)
p = remote("111.231.70.44",28010)
打包(p32/p64)
payload = 'b' * 13 + p32(0x804850f)
payload = 'b' * 13 + p64(0x804850f)
解包(u32/u64)
puts_addr = u32(io.recv(4))
puts_addr = u64(io.recv(4))
发送数据(sendline)
p.sendline(payload)
与shell交互(interactive)
p.interactive()
获取ELF(二进制文件、可执行文件)文件的信息(elf)
对elf文件进行操作,可以获取elf文件中的PLT条目和GOT条目信息
ELF必须大写
elf = ELF('./pwn')
文件装载的基地址(address)
hex(elf.address)
获取函数PLT地址(plt)
这里为获取文件里函数puts由plt表指向got表的地址
意思就是这个函数要看这个地址才能在got表中找到
puts_plt = elf.plt['puts']
获取函数got表地址(got)
puts_got = elf.got['puts']
获取函数地址(symbols)
main_addr = elf.symbols['main']
设置环境的功能(context)
context.log_level = 'debug'
一般来说我们设置context只需要简单的一句话:
context(os='linux', arch='amd64', log_level='debug')
或者 context(os='linux', arch='amd64')
意思是:
1. os设置系统为linux系统,在完成ctf题目的时候,大多数pwn题目的系统都是linux
2. arch设置架构为amd64,可以简单的认为设置为64位的模式,对应的32位模式是’i386’
3. log_level设置日志输出的等级为debug,这句话在调试的时候一般会设置,这样pwntools会将完整的io过程都打印下来,使得调试更加方便,可以避免在完成CTF题目时出现一些和IO相关的错误。
运行到字符串位置停下(recvuntil)
p.recvuntil(“字符串”)
停下后就可用于输入了
一般可以直接省略字符串,有几行就几个换行
比如:
有一行
我们可以写为
io.recvuntil("Doing Stuffz...")
或
io.recvuntil("\n")
这里有两行我们就可简写为
io.recvuntil("\n\n")
用recv函数接收输出的put地址(recv)
p.recv(4)
十六进制输出(hex)
一般所有输出都要转换为16进制
print hex(puts_addr)
socket
创建socker实例(socket)
socket.socket()
连接服务器端(connect)
s.connect(('127,0.0.1',8009))
接收TCP数据,1024为一次数据接收的大小(recv)
s.recv(1024)
发送TCP数据(send)
s.send(('TRUN .' + 'A'*50 + '\r\n'))
用传输完毕后(close)
s.close()
OS
system函数可以将字符串转化成命令在服务器上运行(简单来说就是调用命令行)
os.system('./elf')
NC
nc -lp 2333
[/huayang]
FROM:浅浅淡淡[hellohy]
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论