type
status
date
slug
summary
tags
category
icon
password
gdb 调试
首先给执行权限 chmod +x re1,然后进入 gdb re1。由于没有代码,所以这里只用 layout asm 即可。
解法
做这种题有几种解法,我们浅浅执行一下,发现他是让我们比较字符串,然后才返回flag。因为我们不知道字符串,在观赏汇编代码以后,发现有几种方法来解决:
- 修改 strcmp 的返回值
- 修改标志寄存器的值
- 直接读取比较的字符串
修改strcmp的返回值
首先用 b main 给main函数加个断点,然后ni走到strcmp后面,等到call完strcmp后,会test一次eax,我们把eax的结果改为0(eax是strcmp的返回值,为0的时候表明相等)
此时eflags中有ZF,表明返回两个strcmp的值是相等的,继续往下执行,可以得到flag
修改标志寄存器的值
直接设置ZF为1,使其不通过jmp
直接运行到main+91,然后运行
set $eflags |= (1 << 6)
然后n,获得flag
直接读取比较的字符串
通过x/s或x/32c或x/32x,可以分别读取某个寄存器所在地址的字符串、字符和十进制,这里我们用x/s
得到flag~