pwn13
根据提示,使用gcc编译运行获得flag,gcc flag.c -o hello
flag:ctfshow{hOw_t0_us3_GCC?}
pwn14
阅读源代码,根据第10行代码得知文件名为key
使用gcc编译文件后,在当前目录下创建文件key,根据提示key为CTFshow,运行编译后文件,得到flag
flag:ctfshow{01000011_01010100_01000110_01110011_01101000_01101111_01110111_00001010}
pwn15
使用nasm生成flag.o文件,nasm -f elf64 flag.asm
ld -s -o flag flag.o,生成flag可执行文件
执行./flag得到flag
flag:ctfshow{@ss3mb1y_1s_3@sy}
pwn16
gcc flag.s -o flag
执行./flag获得flag
flag:ctfshow{daniuniuda}
pwn17
先使用nc连接,发现选项3是cat /ctfshow_flag,根据提示不要一直等,可能那样永远也等不到flag,使用IDA静态分析
发现选项3需要非常长的等待时间才能拿到flag,因此我们另寻他法
选项1和2都存在system后门函数,选项1system参数是id并不是/bin/sh,但是选项2我们发现system函数的参数是dest,而dest又是从buf中读取的,因此我们可以构造出/bin/sh
而选项4和选项5就没有什么用处了,选项四只起到提示的作用,而选项五用来退出程序
我们选择选项2,输入/bin/sh,然后ls,cat ctfshow_flag,得到flag
flag:ctfshow{1f651ad9-ae1f-412e-b97a-527d9d64b179}
pwn18
使用IDA打开程序,发现v4等于9就执行fake函数否则执行real函数
我们使用nc连接,输入9就直接出flag了,但是别着急,我们再重开容器,输入一个不等与9的数,发现没有flag,为什么呢?我们来看下fake函数和real函数的区别
利用搜索引擎查询之后发现,>和>>的区别是>>是在文件末尾追加字符串,而>是清空后新增内容,因此执行fake函数可以查看到flag,而执行real函数始终只显示flag is here。
flag:ctfshow{8f05bea8-f1db-4d23-9ff8-ebe2b2a4fa12}
pwn19
根据题目提示关闭了输出流,上网搜索1>&0可以把标准输出重定向到标准输入,执行命令pwd 1>&0,查看当前目录,返回了/,说明当前处于根目录
ls >&0查看当前目录下的文件,看到了ctfshow_flag
cat ctfshow_flag >&0,查看flag
flag:ctfshow{3358d79d-4dc7-4c77-bd5b-403bac7dc9fb}
pwn20
当RELRO为Partial RELRO时,表示.got不可写而.got.plt可写。
当RELRO为FullRELRO时,表示.got不可写.got.plt也不可写。
当RELRO为No RELRO时,表示.got与.got.plt都可写。
先使用checksec命令来查看RELRO的情况,No RELR表示.got与.got.plt都可写。
接着再来查看地址
readelf -S pwn
.got地址为0x600f18,.got.plt地址为0x600f28
flag:ctfshow{1_1_0x600f18_0x600f28}