本文原创作者:W1ngs,本文属i春秋原创奖励计划,未经许可禁止转载!
前言:最近在入门pwn的栈溢出,做了一下jarvisoj里的一些ctf pwn题,感觉质量都很不错,难度循序渐进,把自己做题的思路和心得记录了一下,希望能给入门pwn的朋友带来点帮助和启发,大牛轻喷pwn入门之栈溢出练习

题目链接:https://www.jarvisoj.com/challenges
1、level0(64位)
代码
<ignore_js_op>在IDA中可以看到,buf距离EBP为0x80,但是这个是64位的程序,一个EBP占8bytes,那么payload:

[AppleScript] 纯文本查看 复制代码
1
payload = 'a' *0x80 + 'a'*8(ebp的地址)+p32(system函数的地址)

 

  • p32也就是pack32,把地址的hex值转化为32小端地址存储的方法进行发送


脚本如下:
<ignore_js_op>使用pwntools自带的工具checksec查看程序的保护机制,发现是NX disabled,可以直接往栈上写汇编语句来执行来达到溢出的目的


基本思路:这里printf给出了buf的首地址,所以可以填充返回地址为接收到的buf的首地址,用asm模块向上面写数据,这个也是pwntools自带的模块
使用方法:

[AppleScript] 纯文本查看 复制代码
1
asm(shellcraft.sh())


运行以后可以看到,打印出来的地址的值就是buf的首地址,我们用pwntools接收
<ignore_js_op> 

  • 这里接收到的buf_addr一定要进行int16进制的转换( int(buf,16) ),才能用p32封包进行发送




最后的脚本:
<ignore_js_op>这种方法算是一个通法,也就是使用dynelf的方法来动态的泄露system函数的地址,这里先记住这个方法,后面还会说到

dynelf使用的条件:栈溢出、有输入输出函数(gets、puts、read、write)、无PIE保护


这里在第一输入点进行栈溢出,leak出system函数的地址并返回主函数
<ignore_js_op> 

  • 这里使用gdb的vmmap的方法找到可写段,使用后面的数据段不容易出错


<ignore_js_op>payload = 'a' *0x88 + 'a'*4 + p32(system_addr) + p32(1) + p32(bin_addr)

  • p32(1)为无效的填充的返回地址,这里我们调用完system函数就行了,不用管这个地址
  • 这里使用elf的search方法来搜索字符串,next方法取到第一个匹配到的字符串



这里的ELF方法可以打印输出基本的plt、got表中函数的地址,就不需要我们手动进行查找了,具体的可以看下面的文章
https://blog.csdn.net/weixin_41400278/article/details/78819950


   这里也可以通过read函数来向可写段写入/bin/sh字符串,思路就是先调用read函数写入字符,之后返回主函数,再向栈内写入system函数,这是在没有/bin/sh字符串的时候使用。在这里就显得多此一举了
<ignore_js_op> 

  • 这里最后用sleep函数暂停一下


运行脚本getshell
<ignore_js_op>http://pwnable.kr

相关文章: