关于GDB的简单使用
题目链接:simple-check-100
GDB安装教程(以及peda插件)我的另一篇文章
注:本博文记录压缩包中ELF文件flag的获取过程,exe文件flag是乱码,具体过程就不给大家演示了。着重分享GDB的内容。
GDB的实现原理:其他师傅的文章,很详细
step 1 获取信息
我们拿到了题目,老样子获取信息。
step 2 放入IDA分析一下
int __cdecl main(int argc, const char **argv, const char **envp) { void *v3; // rsp const char **v5; // [rsp+0h] [rbp-60h] int v6; // [rsp+Ch] [rbp-54h] char v7; // [rsp+1Ch] [rbp-44h] char v8; // [rsp+1Dh] [rbp-43h] char v9; // [rsp+1Eh] [rbp-42h] char v10; // [rsp+1Fh] [rbp-41h] char v11; // [rsp+20h] [rbp-40h] char v12; // [rsp+21h] [rbp-3Fh] char v13; // [rsp+22h] [rbp-3Eh] char v14; // [rsp+23h] [rbp-3Dh] char v15; // [rsp+24h] [rbp-3Ch] char v16; // [rsp+25h] [rbp-3Bh] char v17; // [rsp+26h] [rbp-3Ah] char v18; // [rsp+27h] [rbp-39h] char v19; // [rsp+28h] [rbp-38h] char v20; // [rsp+29h] [rbp-37h] char v21; // [rsp+2Ah] [rbp-36h] char v22; // [rsp+2Bh] [rbp-35h] char v23; // [rsp+2Ch] [rbp-34h] char v24; // [rsp+2Dh] [rbp-33h] char v25; // [rsp+2Eh] [rbp-32h] char v26; // [rsp+2Fh] [rbp-31h] char v27; // [rsp+30h] [rbp-30h] char v28; // [rsp+31h] [rbp-2Fh] char v29; // [rsp+32h] [rbp-2Eh] char v30; // [rsp+33h] [rbp-2Dh] char v31; // [rsp+34h] [rbp-2Ch] char v32; // [rsp+35h] [rbp-2Bh] char v33; // [rsp+36h] [rbp-2Ah] char v34; // [rsp+37h] [rbp-29h] __int64 v35; // [rsp+38h] [rbp-28h] const char ***v36; // [rsp+40h] [rbp-20h] unsigned __int64 v37; // [rsp+48h] [rbp-18h] v6 = argc; v5 = argv; v37 = __readfsqword(0x28u); v7 = 84; v8 = -56; v9 = 126; v10 = -29; v11 = 100; v12 = -57; v13 = 22; v14 = -102; v15 = -51; v16 = 17; v17 = 101; v18 = 50; v19 = 45; v20 = -29; v21 = -45; v22 = 67; v23 = -110; v24 = -87; v25 = -99; v26 = -46; v27 = -26; v28 = 109; v29 = 44; v30 = -45; v31 = -74; v32 = -67; v33 = -2; v34 = 106; v35 = 19LL; v3 = alloca(32LL); v36 = &v5; printf("Key: ", argv, 3LL, 16LL, 20LL, 0LL, argv); __isoc99_scanf("%s", v36); if ( (unsigned int)check_key(v36) ) interesting_function(&v7); else puts("Wrong"); return 0; }
我们可以得出check_key是核心函数,只要使得if ( (unsigned int)check_key(v36) )
成功即可。这样我们就可以进入GDB进行调试了。
step 3 进入GDB进行动态调试
step 3 进入GDB进行动态调试
GDB的常用命令如下:
peda的常用命令如下:
现在来看我们的程序,需要输入指令如下:
gdb file task9_x86_64_46d01fe312d35ecf69c4ff8ab8ace75d080891dc b main r
我们单步步过直到check_key函数,单步步过的指令是n
step 4 跳过check_key函数
把test eax,eax改为真即可,也就是把eax改为1。
set $eax=1
这样我们就得到了这个题目的flag:flag_is_you_know_cracking!!!
希望大家可以有所收获!