题目来自《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
箭头所指就是即将要运行的
红色的是cmp比较函数,就是刚刚写的if
3.3下断点
b *0x555555555162
3.4直接运行到断点处
c
发现要比较的是eax和rbp-0x4
3.5
查看下,给他改了
p $eax
x/w $rbp-0x8
set $eax =0x65
x的用法参考这个
(1条消息) GDB查看指定内存地址的内容——指令x_Jeremy_ku的博客-CSDN博客_gdb查看地址内容
比较的是dword嘛双字节所以就是w了
或者改rbp-0x8也可以
但是set $rbp-0x8改的是它所指向的地址,并不是地址所指向的内容
改内容要set *地址
改的话记得加0x十六进制
3.6然后c
c
就可以执行到shellcode了