文章目录
- @[toc]
- CTF学习笔记——PWN(入门)
- PWN基础概念
- NC题
- [HGAME 2023 week1]test_nc
- 栈溢出
- [HNCTF 2022 Week1]easyoverflow
- 伪随机数
- [SWPUCTF 2022 新生赛]Darling
- 待补充
- 待补充
文章目录
- @[toc]
- CTF学习笔记——PWN(入门)
- PWN基础概念
- NC题
- [HGAME 2023 week1]test_nc
- 栈溢出
- [HNCTF 2022 Week1]easyoverflow
- 伪随机数
- [SWPUCTF 2022 新生赛]Darling
- 待补充
- 待补充
CTF学习笔记——PWN(入门)
🚀🚀这篇笔记是我对自己初步学习CTF的一个小总结,主要涉及了PWN板块的入门题型,比如栈溢出等,这部分内容比较简单,算是对PWN形成一个简单的概念,来帮助我们进行后面的学习,本文没有很多基础知识的介绍,主要集中在题目的总结,所以此篇笔记主要起到一个分析总结的作用。
PWN基础概念
🚀🚀CTF中PWN题型通常会直接给定一个已经编译好的二进制程序(Windows下的EXE或者Linux下的ELF文件等),然后参赛选手通过对二进制程序进行逆向分析和调试来找到利用漏洞,并编写利用代码,通过远程代码执行来达到攻击的效果,最终拿到目标机器的shell夺取flag。
🚀🚀所以就需要我们发送一些畸形数据(payload)实现漏洞利用,让二进制程序调用终端(通常是启动sh),这样选手的输入便传递给终端,然后可执行任意命令并返回结果,这里面也就包括我们需要的flag。
🚀🚀接下来我们来介绍一下常见的基础题型:
NC题
🚀🚀NC题其实是最简单的一类题型,但是他却是PWN题不可或缺的一环,当我们攻破了主机之后,就需要去主机里面找flag了:
🚀🚀接下来我们来看一下具体的题目:
[HGAME 2023 week1]test_nc
🚀🚀题目:[HGAME 2023 week1]test_nc | NSSCTF
🚀🚀我们开启环境后只有一个靶机给我们连接,所以我们直接在kali里面输入:
nc node5.anna.nssctf.cn xxxxx
🚀🚀然后我们连接上了主机,可以直接去寻找我们的flag了,无非就是cd 和cat命令到处找,比较简单:
cat flag
🚀🚀发现falg:
NSSCTF{xxx}
栈溢出
🚀🚀栈是PWN很重要的一环,其中包含很多的攻击方法与题型,但是我们在这只介绍最简单的栈溢出题型,这也是后面的基础。
[HNCTF 2022 Week1]easyoverflow
🚀🚀题目:[HNCTF 2022 Week1]easyoverflow | NSSCTF
🚀🚀打开附件得到一个.c文件和一个可执行文件,我们先看一下C语言的代码:
#include<stdio.h>
int main()
{
setbuf(stdin,0);
setbuf(stdout,0);
setbuf(stderr,0);
puts("Input something");
char name[30];
int number=0;
gets(name);
if(number!=0){
puts("You win.");
system("cat flag");
}
return 0;
}
🚀🚀我们能看到只要number不为0,就会输出我们的flag,而且还有gets函数,所以我们考虑栈溢出,只要把number覆盖掉就好了,所以我们把程序放入IDA(64位)中分析一下。
🚀🚀我们看到只要疯狂输入,就可以覆盖掉number(var_4)中的内容,从而输出flag。我们先连接一下远程靶机。
nc node5.anna.nssctf.cn xxxxx
🚀🚀然后疯狂输入‘a’就可以得到flag。
NSSCTF{xxxx}
伪随机数
🚀🚀伪随机数一般都是设定一个随机数种子,然后让我们去猜,这种情况我们只需要模拟运行即可。
[SWPUCTF 2022 新生赛]Darling
🚀🚀题目:[SWPUCTF 2022 新生赛]Darling | NSSCTF
🚀🚀我们放入IDA中观察到main函数如下:
int __cdecl main(int argc, const char **argv, const char **envp)
{
int v4[2]; // [rsp+Ch] [rbp-14h] BYREF
int v5; // [rsp+14h] [rbp-Ch]
unsigned __int64 v6; // [rsp+18h] [rbp-8h]
v6 = __readfsqword(0x28u);
init(argc, argv, envp);
pic();
darling();
puts("There may be many uncertainties in the world, but the only certainty is my love for you.\n");
v4[1] = 20020819;
srand(0x1317E53u);
v5 = rand() % 100 - 64;
__isoc99_scanf("%d", v4);
if ( v5 == v4[0] )
backdoor();
else
puts("Oh :( , you didn't get my love");
return 0;
}
int backdoor()
{
return system("/bin/sh");
}
🚀🚀我们看到只要v5 == v4[0]即可进入后门函数,所以我们需要知道v5的大小,编写代码如下所示:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
srand(0x1317E53u);
n = rand() % 100 - 64;
printf("%d",n);
}
🚀🚀之后输入运行结果就能得到flag。
NSSCTF{xxxx}
待补充
🚀🚀之后输入运行结果就能得到flag。
NSSCTF{xxxx}
待补充
🚀🚀CTF中的PWN入门暂时先介绍这么多,相信大家对PWN有了一个基本的概念,我会在接下来的学习中不断补充,同时也希望我能一直坚持下去。