CTF
文章平均质量分 75
题解
whiteh4nd
这个作者很懒,什么都没留下…
展开
-
HWS计划2021硬件安全冬令营线上选拔赛
REVERSEdecryption直接按照算法爆破(都是可见字符)expbuf=[0x12,0x45,0x10,0x47,0x19,0x49,0x49,0x49,0x1a,0x4f,0x1c,0x1e,0x52,0x66,0x1d,0x52,0x66,0x67,0x68,0x67,0x65,0x6f,0x5f,0x59,0x58,0x5e,0x6d,0x70,0xa1,0x6e,0x70,0xa3]temp=[0x2d,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x3原创 2021-02-03 10:35:11 · 2818 阅读 · 11 评论 -
level6(Jarvis OJ)
0x0 程序保护和流程保护:流程:main()init_note_pointer()在note_pointer处存放note的信息,note_pointer[0]代表最多存放256个note,note_pointer[1]代表当前的note数量。选择1会输出全部的note,选择2会新建一个note,结构为{ flag; //1代表正在使用,反之为0 length; //note的长度 note_pointer; //执行note的指针}选择3可以修改note的长度和内原创 2020-06-17 23:19:00 · 374 阅读 · 0 评论 -
welpwn(xctf)
0x0 程序保护和流程保护:流程:main()echo()echo函数中存在明显的栈溢出漏洞。0x1 利用过程使用x64的通用gadget,泄露write函数的地址。使用LibcSearcher查出相应的libc,得到system函数和/bin/sh字符串的地址就可以getshell了。但是理想是丰满的现实是骨感的,exp写完后一直报错。用GDB查看一下core。发现确实覆盖了返回地址但是后面紧接着是输入缓冲区中的数据。回过去看echo函数,发现在写入s2的时候/x00会被截断,这种截断原创 2020-06-15 13:56:57 · 260 阅读 · 0 评论 -
Mary_Morton(xctf)
程序保护和流程保护:流程:main()如果输入1会进入这个函数有一个栈溢出漏洞。如果输入2会进入这个函数有一个格式化字符串漏洞。还有一个cat_flag的函数0x1 利用过程首先这个程序开启了canary,所以直接栈溢出会报错。但是我们知道v2变量中存放的是canary值(v2在函数开始时就被**__readfsqword(0x28u)赋值,函数结束前与__readfsqword(0x28u)**进行比较),如果我们能通过格式化字符串漏洞将v2的值泄露出来就可以利用栈溢出漏洞原创 2020-06-12 09:54:34 · 396 阅读 · 0 评论 -
warmup(xctf)
0x0 exp没有附件。就是要blind pwn。nc连接了几次都给了同一个返回地址。所以就写个循环一直试。from pwn import *addr=0x40060Ddef send(sh,form,num): payload='a'*num if form == 1: payload+=p64(addr) if form == 2: payload+=p32(addr) sh.sendlineafter('&g原创 2020-05-26 23:07:37 · 369 阅读 · 0 评论 -
forgot(xctf)
0x0 程序保护和流程保护:流程:main()int __cdecl main(){ size_t v0; // ebx char v2[32]; // [esp+10h] [ebp-74h] int (*v3)(); // [esp+30h] [ebp-54h] int (*v4)(); // [esp+34h] [ebp-50h] int (*v5)(); // [esp+38h] [ebp-4Ch] int (*v6)(); // [esp+3Ch] [ebp-48原创 2020-05-26 21:40:28 · 395 阅读 · 0 评论 -
stack2(xctf)
0x0 程序保护和流程保护:流程:当选择change number时没有对数组边界进行检查所以可以任意地址写。又在函数列表中发现一个hackhere()0x1 利用过程我们只需要通过数组写入这个函数的地址到main函数的返回地址处即可。简单计算一下。v13这个数组首地址距离返回地址0x70+0x4,发现不行。然后用ida远程调试一下。输入了五个数字分别是1,2,3,4,5。offset=0xFFBDC56C-0xFFBDC4E8=0x84。远程发现没有bash。换成system(原创 2020-05-26 20:37:39 · 738 阅读 · 0 评论 -
pwn线上环境搭建
ctf pwn 题目部署在做ctf pwn的题目的时候总会忍不住的想,这个目标主机的环境是怎样搭建的。所以本文旨在快速的搭建一个ctf pwn的远程环境。0x0 演示环境在Vmware15.5.2中Ubuntu16.04.6(desktop-amd64)实现环境的搭建。系统安装可以参考。0x1 环境配置这里用的是一个GitHub上的一个项目pwn_deploy_chroot,参照大神亲自写的blog如何安全快速地部署多道 ctf pwn 比赛题目。项目特点。一次可以部署多个题目到一个原创 2020-05-26 16:23:57 · 1706 阅读 · 0 评论 -
Vmware15.5.2中安装Ubuntu16.04及pwn做题工具的安装
0x0 前言选择Vmware15.5.2加上最经典的Ubuntu16.04.6(desktop-amd64)。0x1 Ubuntu安装过程打开Vmware选择左上角的文件->新建虚拟机。选择典型安装后点击下一步选择稍后安装操作系统。点击下一步。点击下一步。虚拟机名称位置可以默认也可以自己改。点击下一步。磁盘容量自行选择(20GB够用了),下面的选项默认即可。点击下一步。点击自定义硬件。在CD/DVD(SATA)处添加我们的镜像文件,删除不必要的设备,网络原创 2020-05-26 00:16:13 · 515 阅读 · 0 评论 -
dice_game(xctf)
0x0 程序保护和流程保护:流程:main()sub_A20()sub_B28()只要sub_A20()的验证通过50次就可以通过sub_B20()输出flag。而sub_A20()通过随机数来决定返回的值是否为1。整个程序只有fgets()处可以覆盖栈上其他变量的值,所以可以通过fgets()修改seed[0]的值。0x1 利用过程可以观察到seed[0]处于rsp+40h的位置所以padding=‘a’*40之后就可以覆盖seed[0]的值了。0x2 expfrom pwn原创 2020-05-24 21:43:18 · 885 阅读 · 0 评论 -
实时数据监测(xctf)
0x0 程序保护和流程保护:流程:main()locker()imagemagic()当key=35795746=0x2223322时调用system("/bin/sh"),在imagemagic()中又存在格式化字符串漏洞。所以只需要更改key的值即可。0x1 利用过程先确定偏移量。偏移量为12。但是我们要向key的地址写入35795746=0x2223322,如果一次性写入35795746个字符的话输入缓冲区可能会溢出导致程序无法运行。所以我们选择单字符写入所以payloa原创 2020-05-24 20:39:10 · 912 阅读 · 0 评论 -
反应釜开关控制(xctf)
0x0 程序保护和流程保护:流程:main()gets明显存在栈溢出。又在函数列表中找到了shell()函数。0x1 利用过程直接覆盖return的地址payload=0x208*‘a’+p64(0x4005F6)expfrom pwn import *#sh=process('./a')sh=remote('124.126.19.106','53303')sh.recvuntil('>')payload=0x208*'a'+p64(0x4005F6)sh.sendli原创 2020-05-24 16:46:36 · 767 阅读 · 6 评论 -
pwn-100(xctf)
0x0 程序保护和流程保护:流程:main()sub_40068E()sub_40063D()通过程序流程我们可以看出在sub_40068E()调用sub_40063D()时发生了栈溢出。0x1 利用过程1.这个程序没有system()函数,也没有"/bin/sh"。但是我们程序运行的时候需要libc。而libc中有我们需要的system(),所以我们只需要确定libc的基地址就可以知道system()。这里给出两种方法获取libc的基地址。第一种是pwntools自带的DynELF原创 2020-05-24 16:02:48 · 441 阅读 · 0 评论 -
CGfsb(xctf)
0x0 程序保护和流程保护:流程:main()可以明显的发现存在一个格式化字符串漏洞,然后当pwnme这个变量等于8时调用’cat flag’这个命令。又因为程序没有开启pie并且pwnme是全局变量,所以可以通过格式化字符串漏洞将pwnme这个变量改为8从而得到flag。0x1 利用过程首先先确定偏移量可以发现偏移量是10,然后查看pwnme变量的地址将pwnme的值改为...原创 2020-05-06 23:19:03 · 688 阅读 · 0 评论 -
string(xctf)
0x0 程序保护和流程保护:流程:main()将v3变量的地址赋值给v4,输出v3和v3+4的地址。调用sub_400D72(v4)。sub_400D72()如果名字长度小于12就分别调用三个函数。sub_400A7D()如果输入east就会返回,否则就会进入sub_4009DD(),然后无论如何都会结束程序。sub_400BB9()输入east之后就会进入这个函数。...原创 2020-05-06 23:15:56 · 372 阅读 · 2 评论 -
level3(xctf)
0x0 程序保护和流程保护:流程:main()vulnerable_function()很明显的栈溢出。0x1 利用过程整个程序中没有我们能利用的部分,但是题目给我们提供了一个libc。所以可以通过泄露got表的地址获取libc的基地址。libc中有system()函数,还有"/bin/sh"。因此我们先使用write()泄露got表中的地址计算出libc的基地址调用完成之后返...原创 2020-05-06 23:11:24 · 494 阅读 · 0 评论 -
int_overflow(xctf)
0x0 程序保护和流程保护:流程:main()login()check_passwd()分析流程可知当我们输入的passwd的长度在3~7之间时可以将passwd复制到dest中。而用来储存passwd的长度的变量是无符号的int8。int8能储存的最大值是255。超过255就会回到0。0x1 漏洞利用根据判断可以将passwd的长度控制在259~263之间就可以完成利用了...原创 2020-05-06 23:09:20 · 595 阅读 · 0 评论 -
guess_num(xctf)
0x0 程序保护和流程保护:流程:main()sub_C3E()如果程序能成功运行到最后就能获得flag0x1 利用过程由于程序保护的比较全面,因此不能通过gets()进行栈溢出,所以只能通过模仿程序流程来解决问题。查阅资料得知srand(seed)会根据seed的数值改变rand()函数产生的随机数,也就是说相同种子生成的随机数是相同的。刚好gets()函数可以修改seed[...原创 2020-05-06 23:05:21 · 460 阅读 · 0 评论 -
level2(xctf)
0x0 程序保护和流程保护:逻辑:main()vulnerable_function()很明显是一个栈溢出漏洞。0x1 利用过程既然系统给了一个system(),那么只需要/bin/sh就可以getshell了。所以要么我们自己构造要么去二进制文件中寻找。找到了字符串之后就可以对漏洞进行利用了。根据32位可执行文件的调用函数的参数入栈顺序,我们可以将buf=‘a’*(0x8...原创 2020-05-06 23:03:03 · 576 阅读 · 0 评论 -
level0(xctf)
0x0 程序保护和流程保护:流程:main()vulnerable_function()很明显的栈溢出,read()允许输入0x200个字符而buf只有0x800x1 利用过程我们在ida的函数窗口处发现了一个callsystem(),可以直接getshell所以我们只需要将返回地址覆盖成callsystem()的地址就可以拿到flag,buf=0x88*‘a’+p64(0...原创 2020-05-06 22:56:58 · 935 阅读 · 0 评论 -
format2(xctf)
0x0 程序保护和流程保护:流程:main()接收一个最长为30的字符串,通过base64解密后长度小于12就会将解密后的字符串复制到input处,之后调用auth()。在将input中的字符串复制到v4的时候存在四个字节的溢出。如果返回值为1的话就会进入correct()。此时如果input==0xDEADBEEF的话就能够getshell了。0x1 利用过程1.虽然checksec提示说程序开启了canary但是在主要逻辑上的函数都没有开启canary,所以可以进行溢出。2.因原创 2020-09-02 17:29:07 · 742 阅读 · 0 评论 -
1000levevls(xctf)
0x0 程序保护和流程保护:流程:main()输入1进入go(),输入2进入hint(),输入3退出程序。go()根据输入数字的大小确定check()的递归次数。可以发现存在栈溢出漏洞。hint()如果unk_20208C的值不为零就输出system函数的地址。0x1 利用过程1.因为程序开启了pie所以无法通过栈溢出泄露地址。只能看一下能否修改unk_20208C的值输出system函数的地址,但是找不到修改unk_20208C的方法。2.只能看一下system函数的地址原创 2020-09-02 13:42:32 · 329 阅读 · 0 评论 -
Aul(xctf)
0x0 利用过程1.题目没有给附件,直接使用nc连接发现是一个交互的场景,输入help之后输出了一堆东西。通过开头可以猜测出这是Lua编写的脚本,其中还有一些字符串很像函数的名字。2.输入help泄露出的函数名字。writelineio.open()通过错误信息可以得知程序将输入的字符串转化成相应的函数执行并返回结果。3.确定了程序的功能后,输入lua脚本执行系统命令的语句。发现getshell了。0x1 expfrom pwn import *sh=remote('220.2原创 2020-08-31 11:17:38 · 429 阅读 · 0 评论 -
Rcalc(xctf)
0x0 程序保护和流程保护:流程:main()init_heap()qword_6020F8存放着第一个申请的chunk,qword_6020F0存放着第二个申请的chunk,*(qword_6020F8+8)存放着第三个申请的chunk,*(qword_6020F0+8)存放着第四个申请的chunkreal_main()程序没有开启canary保护,但是通过create_random()和get_random()实现了canary的功能。在输入name的时候没有限制长度,存在栈溢出。原创 2020-08-30 22:06:54 · 384 阅读 · 0 评论 -
dubblesort(xctf)
0x0 程序保护和流程保护:流程:main()存在一个问题,如果输入的数字个数过大会在输入数字的时候将栈中的数据覆盖。0x1 利用过程1.这个问题其实跟栈溢出差不多,题目又给出了libc,所以可以通过泄露libc的基地址计算出system函数的地址和/bin/sh字符串的地址。2.因为buf在接收字符串之前没有清空里面可能存在垃圾数据,并且read函数输入的字符串不会加’\x00’进行截断所以可以通过buf泄露栈中的数据。在输入’aaa\n’后可以看到栈中还有很多数据,可以通过输入0x原创 2020-08-26 20:54:25 · 434 阅读 · 1 评论 -
babyfengshui(xctf)
0x0 程序保护和流程保护:流程:main()add_user()连续分配了两个堆块,并将第一次分配的堆块的指针存入第二次分配的堆块的fd字段,bk字段开始存放name,之后调用了update_user()输入完length之后要经过判断,需要第一次分配的堆块的数据段的地址加上输入的长度的值必须小于第二次分配的堆块的数据段的地址减4的值才能输入text。delete_user()根据索引分别释放两个堆块,再将指向第二次分配堆块的指针清零。display_user()根据索引输原创 2020-08-21 16:27:54 · 220 阅读 · 0 评论 -
easyfmt(xctf)
0x0 程序保护和流程保护:流程:main()可以发现在if中存在格式化字符串漏洞。但需要通过CheckIn()的返回值决定是否执行if中的语句。通过一个time()获取当前时间,并将当前时间当成srand()的seed,之后根据seed产生出的随机数对5取模再加48存放在v3[0]中,之后将输入的值跟v1进行比较返回结果。0x1 利用过程1.想要利用格式化字符串漏洞就必须绕过CheckIn()的限制,因为反汇编出来的源码可能会有一点问题,因此对汇编代码进行分析。通过分析可知程序将随原创 2020-08-20 16:56:03 · 488 阅读 · 0 评论 -
Noleak(xctf)
0x0 程序保护和流程保护:流程:main()create()delete()free之后没有将指针置空,存在UAF。edit()没有对输入数据的大小作出限制,存在堆溢出。0x1 利用过程1.题目中的got表不可写,又没有输出函数,无法泄露地址,但是堆栈上可以执行代码,所以需要一个可执行的指针变量指向shellcode的地址,才能够执行shellcode。2.可以使用Unsorted bin attack改写buf中指向chunk的地址为main_arena的地址,之后通过u原创 2020-08-19 20:27:51 · 508 阅读 · 0 评论 -
echo_back(xctf)
0x0 程序保护和流程保护:流程:main()echo_back()存在一个格式化字符串漏洞。0x1 利用过程1.题目保护全开,程序中又没有可用的字符串,函数。所以只能通过格式化字符串漏洞泄露地址,写入有限数据。2.既然有格式化字符串漏洞,肯定是要泄露栈上的信息。但是由于限制了字符串最长为7,所以只能逐位泄露。选择使用ida的远程调试,因为可以丢弃alarm()发出的signal。选择在echo_back()的retn处下断点直到到输入%6$p时在栈上发现了被输出的数据(为什么是原创 2020-08-16 21:43:12 · 754 阅读 · 0 评论 -
4-ReeHY-main-100(xctf)
0x0 程序保护和流程保护:流程:main()程序的问题主要存在于两个函数,第一个问题位于是create()输入的size是有符号的,而在调用read函数是传入的参数是无符号的。所以存在整数溢出从而导致了栈溢出。第二个问题位于delete()只对索引做了限制,没有对堆块的指针清零,所以存在UAF。0x1 利用过程栈溢出的利用过程:对于padding的长度是0x98应该没什么问题,但是在对栈进行覆盖时必须注意栈中变量是否在覆盖后仍然被程序使用并且是否合法。如程序中的memcpy(原创 2020-08-14 16:56:48 · 319 阅读 · 0 评论 -
secret_file(xctf)
0x0 程序保护和流程保护:流程:main()程序先在sub_E60()中给v14,v15赋值。然后接收一行的数据存入lineptr中,将换行符换成\x00后将lineptr中的数据复制到dest中,通过sub_DD0()将dest处前0x100的字符串的sha256的摘要存入v16中。之后将其转化为十六进制存入v17中,之后与v15中的值进行比较如果正确就执行popen函数参数为v14。0x1 利用过程1.通过对流程的分析,在getline对输入没有长度限制,导致了在strcpy函原创 2020-08-12 16:15:16 · 329 阅读 · 0 评论 -
greeting-150(xctf)
0x0 程序保护和流程保护:流程:main()存在一个明显的格式化字符串漏洞。0x1 利用过程1.格式化字符串漏洞的出现代表着只要有权限,就能完成任意地址写。而题目的保护是没有开启重定位表只读保护,所以可以修改函数的got表。所以可以修改一个参数由输入决定单参数函数的got表为sysytem函数的地址,这样就当输入**/bin/sh**的时候就可以完成getshell了。通过观察程序,决定修改strlen函数的got表。2.由于需要二次输入,涉及到控制程序流程。而控制流程需要一个可执行的指原创 2020-08-10 21:47:31 · 696 阅读 · 2 评论 -
Recho(xctf)
0x0 程序保护和流程保护:流程:main()存在一个很明显的问题,就第二次可以输入的字符串大小是根据第一次输入的数字大小确定的,所以存在一个明显的栈溢出。0x1 利用过程1.通过栈溢出控制程序的流程只会发生在函数结束时,但是在这个程序中只要第一次的read函数一直有效程序就不会退出,所以在对栈完成布局之后就需要关闭输入。2.一旦关闭输入,就不能继续输入了,所以必须一次就把gadget全部布置到栈上。3.通过提示可以在.data中找到flag字符串。4.于是猜想需要将名字为flag的原创 2020-08-10 13:18:06 · 1215 阅读 · 0 评论 -
supermarket(xctf)
0x0 程序保护和流程保护:流程:main()real_main()add()依次输入aaaa,100,0x50,aaaa后的会分配两个堆块。heap_pointer的情况。del()根据输入的名字free掉相应的堆块,list()输出所有的信息,change_price()可以修改价格。change_descrip()在这个函数中,如果输入的size和原来的不一样的话就会调用realloc函数重新分配堆块。如果size比原来大则会free掉原来的堆块,并且重新分配一个堆原创 2020-08-09 19:32:31 · 502 阅读 · 1 评论 -
note-service2(xctf)
0x0 程序保护和流程保护:流程:main()real_main()选择1可以新建一个note,选择2和3没有实现,选择4可以删除note,选择5可以退出程序。但是在选择1的时候没有对数组的边界进行考虑。0x1 利用过程1.虽然这个程序也存在UAF漏洞但是由于输出和修改功能没有实现所以能利用的角度基本没有,但是数组越界可以任意地址写。2.可以发现相对于数组的低地址处有**.got.plt表,并且.got.plt表是有读写权限的。所以可以修改.got.plt**表可以得到偏移就是原创 2020-08-08 22:21:36 · 564 阅读 · 0 评论 -
pwn1(xctf)
0x0 程序保护和流程保护:流程:输入1能够读入长度为0x100的字符串到s而s距离rbp的距离为0x90存在明显的栈溢出,输入2能够输出s,输入3则退出程序。0x1 利用过程1.因为程序保护中开启了canary所以直接进行栈溢出就会触发canary。所以可以利用puts函数的特性一直输出字符直到遇到**\x00**,将canary的值输出出来。当输入0x87*‘a’+’/n’时不会有多余数据输出,而当输入0x88*‘a’+’/n’就会有多余数据输出,说明canary中有**\x00**。原创 2020-08-08 16:08:18 · 534 阅读 · 0 评论 -
pwn-200(xctf)
0x0 程序保护和流程保护:流程:main()overflow()明显的栈溢出漏洞。0x1 利用过程1.由于题目没有给出libc的版本,所以需要通过pwntools中的DynELF或者Libcsearch得出libc的版本。2.如果使用DynELF则需要向内存写入**/bin/sh**,而Libcsearch则不用。3.payload的构造(以DynELF为例):payload=padding+p32(read_plt)+p32(ppp_addr)+p32(0)+p32(bss_原创 2020-08-08 13:40:12 · 639 阅读 · 0 评论 -
time_formatter(xctf)
0x0 程序保护和流程保护:流程:main()选择1可以设置时间格式,选择2可以设置时间,选择3可以设置时区,选择4可以打印时间,选择5可以退出程序。可以看到再选择4的时候使用了snprintf函数构造了一个命令字符串,然后再交由system函数执行相应的命令。ptr在选择1中被赋值。并且ptr所指向的内存空间中的字符串不能含有除**%aAbBcCdDeFgGhHIjklmNnNpPrRsStTuUVwWxXyYzZ:-_/0^#** 之外的字符。最后进入选择5。发现程序在退出原创 2020-08-08 11:00:03 · 362 阅读 · 0 评论 -
hello_pwn(xctf)
0x0 程序保护和流程保护:流程:subsub_400686():当dword_60106C = 1853186401 时进入subsub_400686()函数获得flag。0x1 利用仔细分析后可以发现两个数据是相邻的,我们可以通过read函数改写dword_60106C的值从而获得flag。unk_601068和dword_60106C 只相差四个字节,read函数可以输...原创 2020-05-06 22:53:37 · 635 阅读 · 1 评论 -
when_did_you_born(xctf)
0x0 程序保护和流程保护:流程:分析主要程序逻辑可知,要想获得flag必须让v5等于1926但是第一次输入时v5不能等于1925。但是我们可以通过gets(&v4)将v5的值覆盖成1926。0x1 利用过程v4变量距离rsp的偏移为0x0,v5变量距离rsp的变量为0x8,所以当v4=‘a’*8+p64(1926)时就可以获得flag。0x2 expfrom pwn i...原创 2020-05-06 22:47:50 · 225 阅读 · 0 评论