- 博客(46)
- 收藏
- 关注
原创 linkctf_2018.7_babypie1
会一直打印内存中的数据直到碰到空字节,而canary的最低字节就是\x00,离buf变量也是最近的,所以我们可以将canary的最低字节覆盖,这样就可以让printf把canary的值一并打印出来,然后由于buf数组中有6个元素,每个都是8字节,所有第一次只需要填充前6个元素+最后一个元素的第一个字节就行,总共是41个字节,即可泄露出canary的另外7个字节。-开启了栈溢出保护、栈不可执行保护、pie栈地址随机。然后下面还可以看到偏移为a3e的函数就是后门函数。
2026-05-21 16:34:12
51
原创 picoctf_2018_shellcode
这里可以看出,创建了一个离ebp长度为A0的数组,这就是偏移量,加上4就是0xA0+0x4就能覆盖到返回地址的位置了。搜索到主函数,我这里不知道为什么查看不了反汇编后代码,只能看汇编代码了。
2026-05-15 16:09:12
37
原创 others_babystack1
会一直打印内存中的数据直到碰到空字节,而canary的最低字节就是\x00,离s变量也是最近的,所以我们可以将canary的最低字节覆盖,这样就可以让puts把canary的值一并打印出来。用gdb测试下来就是输入1可以储存payload,输入2打印payload,输入3退出程序。然后还需要去IDA中拿到main函数的地址,这里就不演示了。-重点看到开了栈溢出保护和栈不可执行保护。
2026-05-14 17:21:00
55
原创 [ACTF2020 新生赛]Upload1
将文件后缀改为phtml发现可以上传,后面用蚁剑连接,成功拿到flag。点击靶机链接,发现有个灯泡可以上传文件。用burp抓包改文件名,php依旧不行。显示只能上传这三种类型的文件。
2026-05-11 21:33:01
42
原创 buuctf中的bjdctf_2020_babyrop2
然后由于在ida中没有发现任何后门函数于system函数的地址,这里选择libc泄露来制造后门,用到了LibcSearcher这个库,这里需要进行两次栈溢出,第一次先泄露出puts函数的地址,用来计算libc的基地址,然后构造system函数地址和/bin/sh地址,然后第二次栈溢出即可注入system函数来拿到shell。上面得手动选libc库,有时会选到不匹配的,多选几个就可以了,然后就是cat flag了。在ida中拿到vuln函数的地址,蓝色部分的地址就是vuln函数的地址。
2026-05-11 13:20:20
58
原创 leetcode:21. 合并两个有序链表
主要思路是依次比较两个链表的第一个节点的大小,小的就连接到新链表后面,直到其中一个链表为空后,将剩下的节点一起全部连接新链表最后。
2026-04-10 20:53:58
102
原创 bugku中的canary
发现有两个read,由于开启了栈溢出保护,在第一个read可用于泄露canary,第二个read再实现栈溢出,这里说一下canary溢出的方法,我们需要在printf打印出buf前buf的内容刚好填充到canary,并且不将其覆盖,printf就会顺便把后面的内容也打印出来,直到遇到'\x00'为止,canary最后一个字符又刚好是'\x00',这样就能泄露出canary了。任何再在Linux中输入:ROPgadget --binary pwn --only "pop|ret"
2026-01-27 11:48:21
386
原创 buuctf中的jarvisoj_level3_x64
这题有两种做法,一种是用LibcSearcher搜索匹配的libc库,一种是用已有的libc库做,由于是64位程序,猜到libc库是libc.so.6,两种做法都需要进行两次栈溢出,第一次计算出libc的基地址,第二次注入system函数拿到shellcode。没发现后门函数,按shift+F12后也没发现/bin/sh地址,考虑泄露libc来拿到shell。首先拿到vulnerable函数地址:0x4005E6,方便后面二次溢出。首先拿到rdi,ret和rsi+r15的地址,方便后面调用write函数。
2026-01-26 17:21:29
371
1
原创 buuctf中的ez_pz_hackover_2016(shellcode注入,信息收集比较麻烦)
看到这里首先打印出了s的地址,然后读取屏幕输入,存到s中,再调用了memchr函数,10是\n的ASCII码值,如果再s中找到了\n就将其转换为\0,下面还有strcmp函数,可以看到只有在s中找到与crashme相同的字符串才能进入vuln函数。现在偏移也知道了,上面没有开启NX保护,我们可以注入shellcode,由于上面给出了s的地址,可以先触发栈溢出,然后在ebp后面的地址注入shellcode,然后算出shellcode地址,再在返回地址处注入shellcode地址。
2026-01-26 15:18:47
350
原创 buuctf中的mrctf2020_shellcode
这里我这里反汇编不了,所以只能看汇编代码了,首先看到buf的长度为0x410,下面调用了puts函数和read函数,read函数则是读入了0x400个字节的数据到buf中,由于上面没有开启NX保护,所以考虑shellcode注入,虽然read只读入了400个数据,但是依旧可以触发栈溢出。下面可以看到retn前并没有pop rbp,也就是说这里并没有rbp,所以偏移就是buf的长度即0x410。拿到shell后手动输入cat flag拿到flag。-got表不可写,地址不固定。
2026-01-25 21:44:12
334
原创 buuctf中的jarvisoj_level3(栈溢出+libc泄露)
这里说一下基本思路:通过两次栈溢出拿到shell,第一次栈溢出先泄露出write函数的真实地址,然后计算出libc基址,进而计算出system函数地址与/bin/sh的地址,然后第二次栈溢出注入system函数来拿到shell,想要进行二次溢出,还需要拿到vuln函数的地址,从IDA中可拿到vuln函数地址为:0x804844B。buf到栈底距离为0x88,但是这里read函数却读入了0x100个字节的数据,可以触发栈溢出漏洞,顺便算出偏移量为:0x88 + 0x4。-仅开启了栈不可执行保护。
2026-01-04 15:37:59
658
原创 buuctf中的pwn2_sctf_2016(libc泄露+栈溢出)
由于没有任何后门函数和地址,只能通过泄露libc地址来计算出system函数和/bin/sh地址,这里首先想到用LibcSearcher去找libc,但是可能又是LibcSearcher中libc库不全的问题,我始终找不到匹配的libc库,最后从题目给出的做题环境是Ubuntu16并且是32位程序猜到libc库是libc-2.23.so才做出题目。思路和上面基本一样,只不过是把LibcSearhcher那里改一下而已。发现vuln函数,并且从左边没有发现任何后门函数。-仅开启了栈不可执行保护。
2026-01-03 19:01:04
499
原创 buuctf中的wustctf2020_getshell(栈溢出)
buf到栈底的距离为0x18个字节,但是这里read却读入了0x20个字节的数据,存在栈溢出漏洞,顺便算出偏移为0x18 + 0x4。发现vulnerable函数和shell函数,分别点进去。顺便拿到shell地址0x804851B。最后手动输入cat flag拿到flag。执行shell函数即可拿到shell。-仅开启了栈不可执行保护。
2026-01-03 17:36:35
522
原创 buuctf中的picoctf_2018_rop chain
由于在程序的反汇编代码中没有任何后门函数和system函数地址,题目也没给libc库文件,这里考虑泄露出某个函数的真实的地址再借助LibcSearcher这个插件找到libc库,再计算出libc基址,进而计算出system函数及/bin/sh的地址。看到了vuln函数和左边的win1,win2函数及flag函数,第一眼看到就觉得能够从这些函数中获取flag,但实际行不行呢,先一个一个点进去看一下。先在IDA中拿到vuln函数的地址,方便后面二次使用栈溢出漏洞:0x8048714。使变量win1的值为1。
2025-12-26 16:37:24
466
原创 buuctf中的[HarekazeCTF2019]baby_rop2
buf到栈底的距离为0x20个字节,但是下面的read函数却读入了0x100个字节的数据,可以触发栈溢出漏洞,在IDA中发现程序没有后面函数,system或/bin/sh地址,再配合前面给的libc库,判断是要我们拿到某个函数的真实进而求出libc的基址再来计算出system和/bin/sh的地址。这里直接输入cat flag是拿不到flag,因为flag不在根目录下,跟着我下面的指令输入就可以拿到flag了。拿到rdi地址:0x400733,用于调用函数,ret地址:0x4004d1,用于栈对齐。
2025-12-26 15:56:10
369
原创 buuctf中的ciscn_2019_es_2(栈迁移)
从上面可以看到s的宽度为40字节,可以将栈迁移到这里执行system函数,所以我们需要知道s的地址,这里我们可以通过s相对于ebp的偏移算出s的地址,但是我们得先拿到ebp的地址,printf有个bug可以让我们拿到ebp的地址,就是如果我们刚好输入了0x28个字节的数据,及将ebp前面的内容都覆盖上,在没遇到/0的情况下,printf会把ebp的地址打印出来,用这个方法拿到ebp的地址。第三行:先将ebp覆盖为s的地址,然后再将ret覆盖为leave_ret的地址。-开启了栈不可执行保护。
2025-12-25 17:36:27
1308
原创 buuctf中的bjdctf_2020_babyrop
第一次栈溢出先泄露出puts的地址,再计算出libc基址和system及/bin/sh的地址,第二次栈溢出直接执行system函数拿到shell,两次溢出都是基于ROP链的构造对函数进行调用。read函数可实现栈溢出,又由于没有发现任何后门函数,需要进行libc的泄露构造system函数和/bin/sh,顺便算出偏移为0x20+0x8 = 40。再来拿到rdi地址:0x400733,ret地址:0x4004c9。发现vuln函数,点进去,没有发现任何后门函数。先拿到main函数地址:0x4006AD。
2025-12-24 00:59:40
303
原创 buuctf中的jarvisoj_tell_me_something(栈溢出)
这是main函数的汇编代码,从这里我们并没有发现pop rbp这条指令,也就是说偏移量不需要加上rbp的宽度,所以总偏移为0x88。v4到栈底的距离为0x88,但是read确读取了0x100个字节的数据,存在明显的栈溢出漏洞。发现是从flag.txt中逐字读取字符并打印到屏幕上,相当与后门函数。-开启了栈不可执行保护。
2025-12-24 00:59:22
672
原创 buuctf中的jarvisoj_fm(格式化字符串任意地址写)
发现没有后门函数,不过有printf函数,可触发格式化字符串漏洞,再看下面,只要让x的值等于4,即可拿到shell,那么方向就很明显了,使用格式化字符串漏洞实现任意地址写,将x的值改写为4。发现0x41414141这个参数在第11位,0x41414141以ASCII码转化为字符即为AAAA,也就是我们输入的AAAA在第11位处,即偏移为11。拿到shell后输入cat flag即可拿到flag。再在IDA中拿到x的地址:0x0804A02C。-开启了栈溢出保护和栈不可执行保护。
2025-12-22 16:03:27
534
原创 buuctf中的bjdctf_2020_babystack2(栈溢出)
发现read函数可触发栈溢出,并且从左边发现存在后门函数,但是read读取的长度受到nbytes这个变量的限制,发现这个变量的数据类型在下面被转化为unsigned int即无符号整数类型,当我们将-1转化为unsigned int类型时,会变成unsigned int的最大值,所以在上面我们只需要输入-1即可在下面触发栈溢出,这里顺便算出偏移量为:0x10+0x8 = 24。拿到backdoor函数地址:0x400726。拿到shell后手动输入cat flag即可。-开启了栈不可执行保护。
2025-12-22 15:23:43
432
原创 buuctf中的铁人三项(第五赛区)_2018_rop
第一次栈溢出先构造ROP链,调用write函数,泄露出write函数的地址,再在write函数的返回地址注入main函数地址以便第二次执行栈溢出漏洞,这里为什么不用puts函数,是因为在IDA中发现源程序中并没有puts函数,但是有write函数,拿到write函数后就可以计算出system函数和/bin/sh的地址了,再在第二次栈溢出时注入system函数拿到shell。buf到栈底的距离为0x88,但是read读入了0x100字节的数据,可触发栈溢出漏洞,顺便算出偏移为:0x88+0x4。
2025-12-19 20:06:58
593
原创 buuctf中的ciscn_2019_ne_5(ROP)
我原本是用case2里的那个puts函数将puts的地址泄露出来,然后得到libc,进而算出/bin/sh的地址,但是可能是LibcSearcher的老毛病(libc库不全),导致我无法得到/bin/sh的地址,最后看了别人的题解才知道可以找sh的地址来代替/bin/sh的地址。可配合将上面读取的变量src的值存放到变量dest中,dest到栈底的距离为0x48字节,但是上面可以想变量src写入128字节的数据,明显比dest大,所以可配合case1触发栈溢出,这里顺便可看出偏移为:0x48 + 0x4。
2025-12-19 17:39:52
738
原创 buuctf中的ciscn_2019_en_2(ROP)
这里需要手动选择libc,64位程序就选64位的libc,可能会选到不适配的libc库,多试几次就可用了,拿到shell后手动输入cat flag拿到flag。顺便算出s到栈底的偏移:0x50+0x8 = 0x58。再在IDA中拿到encrypt地址,用于第一次泄露libc后再次进入encrypt函数:0x4009A0。rdi地址:0x400c83,ret地址:0x4006b9,q其中rdi用于调用函数,ret用于栈对齐。输入1可用进入encrypt函数,输入2可从主函数看到并没有什么用,3是退出程序。
2025-12-18 15:54:22
545
原创 buuctf中的ciscn_2019_n_5(libc泄露+ROP构造)
由于这里shellcode注入不可用,使用第一个read读取内容到name那里的那一行代码已经没有用处了,随便输入一个字符都行,接下来就是进行两次栈溢出,第一次将puts的地址泄露出来,配合LibcSearcher找到libc库,算出libc基址,然后得到system和/bin/sh地址,第二次栈溢出在注入system函数就可以拿到shell。ret地址:0x00000000004004c9,rdi地址:0x0000000000400713,其中ret用于栈对齐,rdi用于构造ROP链调用函数。
2025-12-18 15:22:56
632
原创 buuctf中的not_the_same_3dsctf_2016
这里打开了flag.txt文本文件,这几行代码的作用就是将flag.txt中的内容写入到fl4g这个变量中去,想就是flag了吧,但是发现我们还得自己去调用printf函数将fl4g的内容打印出来才能拿到flag。由于栈溢出执行完printf函数后需要正常退出才能打印出flag的值,所以还需用到exit函数的地址,同样在IDA中拿到:0x0804E660。payload需要先执行get_secret函数将flag读取到对应的变量中后我们再将这个变量的值printf出来。-成功打印出flag。
2025-12-17 15:53:57
655
原创 buuctf中的[OGeek2019]babyrop
再来说一下思路,我们现在IDA中拿到main函数的地址,这里就不演示了,如何第一次栈溢出将返回地址覆盖为puts函数地址泄露出puts的地址,再将puts返回地址覆盖为main函数地址从而第二次进入main函数,结合题目给的libc计算出libc基址后再计算出system和/bin/sh的地址,第二次栈溢出将返回地址覆盖为system函数地址,再传参/bin/sh,拿到shell。-拿到shell后手动输入cat flag拿到flag!-开启了栈不可执行保护。
2025-12-17 15:10:42
500
原创 buuctf中的[NewStarCTF 公开赛赛道]canary
这里说一下思路,程序中有两次格式化字符串漏洞可用,第一次先让其泄露出canary的值和system函数的真实地址,然后计算出基址,进而算出我们需要的各种真实地址,再第二次使用格式化字符串漏洞将money的值改写为999(随便一个较大的数都行,便于栈溢出的利用),第二个payload那里我们本身发送的格式化字符串占9字节,再加上7个垃圾数据刚好16字节,占了2个偏移,刚好覆盖第6和第7个偏移,使用money的地址注入后放在第8个偏移,所以用%8$n。我这里试验后发现main函数的实际地址是在第17位偏移处。
2025-12-16 19:07:14
1473
原创 buuctf中的[NewStarCTF 2023 公开赛道]canary
这里的v5即为canary的值,与buf起始地址的距离为40(0x28),每8字节为一个偏移量,则canary相对于buf的偏移量为5,所以canary总的偏移为5+6=11。发现backdoor函数,有printf格式化字符串漏洞可利用,进行canary值的泄露。backdoor函数地址:0x401262。通过调试得到buf的偏移位移第6位。-开启了canary保护。
2025-12-16 01:24:22
370
原创 buuctf中的[NewStarCTF 2023 公开赛道]ret2text
由于这道明确知道是ret2text类题目使用只需知道canary栈溢出保护并没有开启就行。-可使用read触发栈溢出,将返回地址覆盖为backdoor函数地址。-backdoor函数地址为:0x00000000004011FB。-拿到shell后手动输入cat flag获取flag。
2025-12-15 00:49:46
515
原创 buuctf中的[NewStarCTF 公开赛赛道]ret2text
记下backdoor地址为:0x0000000000400708。-拿到shell后手动输入cat flag拿到flag。-scanf函数可协助进行栈溢出利用。-仅开启了NX栈不可执行保护。
2025-12-15 00:49:33
441
原创 buuctf中的bjdctf_2020_babystack
注意这里要我们输入名字的长度,实则是在现在下面read可以读取的最大宽度,使用尽量大一点方便栈溢出漏洞的利用,我这里设置为666。-这里得到缓冲区到rbp的距离为16,再加上rbp本身的宽度8,得到最终的偏移量为24。backdoor函数地址:0x00000000004006EA。-仅开启了栈不可执行保护机制,注入shellcode不可用。-可利用read函数触发栈溢出漏洞。
2025-12-14 02:57:25
539
原创 buuctf中的others_shellcode
getshell函数内部:发现其之间让我们获得了系统终端。-发现getshell函数。-开启了栈不可执行保护。
2025-12-14 02:57:07
555
原创 buuctf中的jarvisoj_level2_x64
拿到rdi地址:0x00000000004006b3,用来调用system函数。拿到最后一行那个ret的地址:0x00000000004004a1,用于栈对齐。再在代码段拿到system函数地址:0x00000000004004C6。-有read函数可以进行栈溢出,顺便算出偏移为0x80+0x8。按下shift+F12,发现/bin/sh地址,记下来。-拿到shell后手动输入cat flag获取flag。-仅开启栈不可执行保护。
2025-12-13 13:06:29
331
原创 buuctf中的[HarekazeCTF2019]baby_rop
然后再输入:ROPgadget --binary pwn --only "pop|ret" |grep ret,拿到ret地址:0x0000000000400479,用于栈对齐。然后在Linux终端输入:ROPgadget --binary pwn --only "pop|ret" |grep rdi,拿到rdi地址,用于构造ROP链执行函数。-可使用scanf进行栈溢出,顺便算出偏移量为0x10+0x8 = 24。再从代码段拿到system函数地址:0x0000000000400496。
2025-12-13 13:05:54
584
原创 buuctf中的get_started_3dsctf_2016
在get_flag函数返回地址处填入exit函数地址以便正常退出函数,再在之后依次填入a1,a2的值。拿到exit函数地址:0x0804E6A0,作为get_flag函数的返回地址。发现get_flag函数,main函数中gets函数可以触发栈溢出漏洞。拿到get_flag函数地址:0x080489A0。只要a1,a2等于对应的值就可以拿到flag。利用cyclic工具算出偏移量为56。-仅开启了栈不可执行保护。
2025-12-12 01:16:12
655
原创 buuctf中的ciscn_2019_c_1
发现began函数,输入1可进入encrypt函数,发现encrypt中有get函数,可触发栈溢出漏洞,下面的加密输入内容的代码可以无视,按下shift+F12,发现程序中没有自带system函数和/bin/sh地址,这时可考虑进行泄露libc后再构造system函数和/bin/sh来获得shell。基本思路是进行两次栈溢出,第一次溢出拿到puts的地址,泄露出libc,第二次溢出注入system函数来得到shell。拿到rdi和ret的地址,rdi用来执行函数,ret用来栈对齐。
2025-12-12 01:15:02
556
空空如也
buuctf final_fmt
2025-12-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅