动态调试,第一次用
机子太慢了,虚拟机+pwntools安了一天
这个题用ida打开看到特殊的跳转
.text:00000000004009F7 xor eax, eax
.text:00000000004009F9 jz short near ptr loc_4009F3+2
.text:00000000004009FB call near ptr 0C59748h
.text:00000000004009FB ; ---------------------------------------------------------------------------
.text:0000000000400A00 dq 0C0BFC68948FFFFFEh, 0FFFFFE50E8006012h, 0FA74C03105EBB866h
jz后边跑到的地址原来不是那个,这个就是先有个无用的几个字节代码,汇编会当成mov啥的,不影响流程的,然后后边再跳回到这个语句的中间,这样从这开始就变成了别的语句。如果把前边的nop掉也许会影响后边的跳转,所以最好的办法就是用gdb一步步跟。也就是大姥们说的动态调试。
运行时他先有个输出然后输入key ,于是在这个输出后下断点 0x4009ee然后一步步跟。
先是调用strlen然后跟0x10比较,显然输入串长度是0x10,这时候通过修改寄存器值使它相等,然后继续向下。
gdb-peda$ set $rax = 0x10
后边的语句只有两种:
一种是从前数这个字符与指定值比较,这个值就是需要的字符
=> 0x400c15 <main+633>: movzx eax,BYTE PTR [rbp-0x1f9]
0x400c1c <main+640>: cmp al,0x63
0x400c1e <main+642>: je 0x400c2b <main+655>
另一种是要后一个字符和前一个字符相加得一个数
0x400c2b <main+655>: movzx eax,BYTE PTR [rbp-0x1f9]
0x400c32 <main+662>: movsx edx,al
0x400c35 <main+665>: movzx eax,BYTE PTR [rbp-0x1f8]
=> 0x400c3c <main+672>: movsx eax,al
0x400c3f <main+675>: add eax,edx
0x400c41 <main+677>: cmp eax,0x9b <----- 前后两个字母的和是 9b(大部分是9b)
0x400c46 <main+682>: je 0x400c53 <main+695>
大多数和是0x9b还有两个别的,这样一步步修改寄存器让他沿着正确的路径走下来就找到需要的16个字符了。
EZ9dmq4c8g9G7bAV