题目描述:
这个题目针对现在的我还是有点难度的,花费了我三天的时间,最后发现原因竟是因为字符转化为整型的过程中多加了好多0.
分析思路:
1、首先查看文件的详细信息:
tucker@ubuntu:~/xman/pwn/pwn1$ file babystack
babystack: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=d1d54a6fc21f6c1d9a92f4f3bfafadd44683afd4, stripped
tucker@ubuntu:~/xman/pwn/pwn1$ checksec babystack
[*] '/home/tucker/xman/pwn/pwn1/babystack'
Arch: amd64-64-little
RELRO: Full RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
是一个64bit的二进制文件,没有开启PIE,但是开启了canary保护,因此我们首先想到的就是绕过canary保护。
2、使用IDA打开:
__int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
int v3; // eax
char s; // [rsp+10h] [rbp-90h]
unsigned __int64 v6; // [rsp+98h] [rbp-8h]
v6 = __readfsqword(0x28u);
setvbuf(stdin, 0LL, 2, 0LL);
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stderr, 0LL, 2, 0LL);
memset(&s, 0, 0x80uLL);
while ( 1 )
{
puts_info();
v3 = j_read();
switch ( v3 )
{
case 2:
puts(&s);
break;
case 3:
return 0LL;
case 1:
read(0, &s, 0x100uLL);
break;
default:
j_puts("invalid choice");
break;
}
j_puts((const char *)&unk_400AE7);
}
}
从中我们很容易看到并且在puts(&s)中我们也可以控制s的值,从而打印出我们需要的信息。在前面的memset中仅仅初始化了0x80个字节,但在read(0, &s, 0x100uL)读取了0x100个字节,因此存在栈溢出漏洞。
3、我们需要注意,程序为了防止canary泄露,canary的第一个字节为\x00,因此我们首先我们构造payload&#x