[XCTF-Reverse] 40 suctf-2016_serial-150

动态调试,第一次用

机子太慢了,虚拟机+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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值