gdb的简单练习
题目来自《ctf安全竞赛入门》
1.用vim写代码
vim gdb.c
#include "stdio.h"
#include "stdlib.h"
void main()
{
int i = 100;
int j = 101;
if (i == j)
{
printf("bingooooooooo.");
system("/bin/sh");
}
else
printf("error............");
}
如果i==j
也就是100=101
那么就输出:bingooooooooo.
然后执行shellcode
但是这两个怎么可能相等嘛
2.用gcc生成可执行文件
首先用生成目标文件、gcc后边是源文件名字、-o后边的是目标文件名字
gcc -g gdb.c -o gdbshouxi
然后会有一个文件,就叫做gdbshouxi
3.gdb
用gdb调试他
打开方式:
gdb gdbshouxi
就进入gdb了
可以反汇编main函数
disassemble main
3.1书上说让先下断点main
b main
断点下错了可以用d 标号删除
如果不运行下断点到下边那个地址的话到某个地址的话可能会出错
3.2然后运行
r
![](https://img-blog.csdnimg.cn/img_convert/f591ce70249d400bb563a5f487057253.png)
箭头所指就是即将要运行的
红色的是cmp比较函数,就是刚刚写的if
3.3下断点
b *0x555555555162
3.4直接运行到断点处
c
发现要比较的是eax和rbp-0x4
![](https://img-blog.csdnimg.cn/img_convert/ee45f0748e4c4e80b690f0d50e836d91.png)
3.5
查看下,给他改了
p $eax
x/w $rbp-0x8
set $eax =0x65
![](https://img-blog.csdnimg.cn/img_convert/497df402bbb94381ac7796ee9e2d718d.png)
x的用法参考这个
(1条消息) GDB查看指定内存地址的内容——指令x_Jeremy_ku的博客-CSDN博客_gdb查看地址内容
比较的是dword嘛双字节所以就是w了
或者改rbp-0x8也可以
但是set $rbp-0x8改的是它所指向的地址,并不是地址所指向的内容
改内容要set *地址
改的话记得加0x十六进制
3.6然后c
c
就可以执行到shellcode了
![](https://img-blog.csdnimg.cn/img_convert/42174c75f24e486ab3f6bae03eea3f14.png)
yufeiyu66: 讲的很好了,加油
hello_worldpyy: 谢谢!
Hi Qiyun: 为什么我的libcsearcher找不到版本
y6y6y666: 对于64位程序,参数存在于寄存器中,函数的调用顺序是先设置参数然后调用函数
Mr.Ha: 想问一下为什么payload里边顺序是pop_rdi、bin_sh、sys呢,顺序不应该是先调用函数然后用寄存器处理参数嘛