【问题标题】:How do I get my input value to become my eax and equal a given hex value?如何让我的输入值成为我的 eax 并等于给定的十六进制值?
【发布时间】:2015-10-15 15:55:15
【问题描述】:

我有编译的 c 文件来运行这个程序,但它只显示 main.c 文件。我已经转储了汇编代码,需要一些帮助才能通过 8048daf 的 cmp。我发现前导零的数量使我的 eax 等于一个值,但我不能让它等于 0x338。 由于它将我的输入作为字符串,我的理解是 eax 将具有 2、4 等数字作为其值,因为 chars 始终是 2 个值作为其十六进制。

0000000000000000000000000000000000008 

这是我用作输入以使 eax 等于 0x38 的值

 08048d7d <phase_5>:
 8048d7d:   55                          push   %ebp
 8048d7e:   89 e5                       mov    %esp,%ebp
 8048d80:   83 ec 48                    sub    $0x48,%esp
 8048d83:   c6 45 f1 00                 movb   $0x0,-0xf(%ebp)
 8048d87:   c6 45 e2 00                 movb   $0x0,-0x1e(%ebp)
 8048d8b:   c6 45 e1 e5                 movb   $0xe5,-0x1f(%ebp)
 8048d8f:   c6 45 e0 e9                 movb   $0xe9,-0x20(%ebp)
 8048d93:   c7 45 ec 38 03 00 00        movl   $0x338,-0x14(%ebp)
 8048d9a:   8b 45 08                    mov    0x8(%ebp),%eax
 8048d9d:   89 44 24 04                 mov    %eax,0x4(%esp)
 8048da1:   8d 45 c8                    lea    -0x38(%ebp),%eax
 8048da4:   89 04 24                    mov    %eax,(%esp)
 8048da7:   e8 4c fb ff ff              call   80488f8 <strcpy@plt>
 8048dac:   8b 45 ec                    mov    -0x14(%ebp),%eax

这个比较:

8048daf:    3d 38 03 00 00              cmp    $0x338,%eax

 8048db4:   74 05                       je     8048dbb <phase_5+0x3e>
 8048db6:   e8 d8 02 00 00              call   8049093 <trigger_bomb>
 8048dbb:   0f b6 45 e0                 movzbl -0x20(%ebp),%eax
 8048dbf:   3c 66                       cmp    $0x66,%al
 8048dc1:   75 10                       jne    8048dd3 <phase_5+0x56>
 8048dc3:   0f b6 45 e1                 movzbl -0x1f(%ebp),%eax
 8048dc7:   3c 69                       cmp    $0x69,%al
 8048dc9:   75 08                       jne    8048dd3 <phase_5+0x56>
 8048dcb:   0f b6 45 e2                 movzbl -0x1e(%ebp),%eax
 8048dcf:   84 c0                       test   %al,%al
 8048dd1:   74 05                       je     8048dd8 <phase_5+0x5b>
 8048dd3:   e8 bb 02 00 00              call   8049093 <trigger_bomb>
 8048dd8:   c9                          leave  
 8048dd9:   c3                          ret 

【问题讨论】:

  • 您的编程问题是什么?看起来这段代码有一个缓冲区溢出错误。你应该修复它,比如说,切换到strcpy_sstrlcpy,以你可用的为准。
  • 我想我必须利用这个缓冲区溢出来度过这个阶段。 @RaymondChen
  • 你能解释一下我如何利用这个缓冲区溢出返回到不同的位置@RaymondChen
  • 您应该将漏洞报告给程序的作者,以便他们修复它。
  • 那是我的老师。他们知道它在那里。 @RaymondChen

标签: assembly


【解决方案1】:

据我了解,您需要获取没有可打印表示的字节作为输入。在您的情况下是0x030x38。很容易获得0x38,因为字符'8' 具有该ascii 值。但是0x3 呢?来玩perl或其他解释语言:

./a.out $(perl -e 'print "0" x 20 . "\x38\x03"')

这将作为程序的输入,由 20 个字节组成,其中字符 '0' 与两个字节与 0x03 and 0x38 连接(. 用于连接)。

另一个问题是字节序。希望您知道,当我们使用小端序时,内存中的字节会被反转。例如,值0x123456780x78 0x56 0x34 0x12 的形式驻留在内存中。这就是为什么在输入中我们有"\x38\x03" 而不是"\x03\x38"

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多