快速刷通PWN的第三天

这篇博客讲述了在PWN学习过程中,如何解决Stack5题目中的代码执行漏洞。通过使用shellcode,结合nop指令和int 3调试,以及解决因环境变量导致的栈帧地址变化问题。最终利用cat命令技巧,成功获取交互式shell。
摘要由CSDN通过智能技术生成

快速刷通PWN的第三天

计划

声明:因为是自己学习的一个计划,所以可能并不是适用于所有人。但是尽可能考虑到由浅入深,由易到难。

昨天大概完成了 Protostar 的 Stack4 部分,今天继续后面题目的练习。

笔记

Stack5

题目源码如下:

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
   
  char buffer[64];

  gets(buffer);
}

我们会发现源码更简单了,只有一个 gets() 函数,连之前的 win() 函数都没有了,所以可以参考一下题目中给的 Hints:

  • 使用其他人的 shellcode 会更加容易
  • 如果需要调试 shellcode,请使用\xcc(int 3)指令停止程序执行并返回调试器
  • 完成 shellcode 后,删除 int 3。

根据提示我们可以知道,这道题我们需要使用 shellcode,在我们还不会写 shellcode 的时候,可以使用别人的 shellcode。先来推荐一个 shellcode 的数据库网站:http://shell-storm.org/shellcode/。从上面我们可以根据系统的架构类型选择自己喜欢的 shellcode,比如我们选择一个Linux/x86-64 下的简单的拿 shell 的 shellcode

shellcode 的简单用法就是写入栈中(没开任何保护的情况下),然后修改 EIP 寄存器,跳转到我们的 shellcode 的地址,然后执行栈上的 shellcode(所以不能开保护,需要栈可写可执行)。所以分为几步:1. 修改 EIP 寄存器,修改后的值为 shellcode 的地址2. 将 shellcode 写入栈中;3. 调试相关 shellcode,以拿到 shell。我们一步一步慢慢来。

第一步要修改 EIP 寄存器,修改后的值为 shellcode 的地址。那么还是和上一题的步骤一样,确定偏移。因为这个题目中主函数开辟的 buffer 长度和上一题一样,所以计算偏移或者直接试出来的偏离量详细过程在本文中不在赘述,不太清楚的小伙伴可以直接跳转到上一篇博文:快速刷通PWN的第二天 回顾一下。所以偏移 padding 为:

padding = "AAAABBBBCCCCDDDDEEEEFFFFGGGGHHHHIIIIJJJJKKKKLLLLMMMMNNNNOOOOPPPPQQQQRRRRSSSS"

我们还是用 gdb 来调试一下以确定 shellcode 的位置。

user@protostar:/opt/protostar/bin$ gdb stack5 # 这是一个伏笔
(gdb) set disassembly-flavor intel
(gdb) disassemble main
Dump of assembler code for function main:
0x080483c4 <main+0>:    push   ebp
0x080483c5 <main+1>:    mov    ebp,esp
0x080483c7 <main+3>:    and    esp,0xfffffff0
0x080483ca <main+6>:    sub    esp,0x50
0x080483cd <main+9>:    lea    eax,[esp+0x10]
0x080483d1 <main+13>:   mov    DWORD PTR [esp],eax
0x080483d4 <main+16>:   call   0x80482e8 <gets@plt>
0x080483d9 <main+21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值