linux系统调用号查询(pwn)
在线查询链接:https://syscalls.w3challs.com/
分为32位和64位,链接中还有arm、mips等架构的系统调用号。
32位12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717 ...
堆基础知识
堆概述
内容绝大部分来自ctf-wiki,文章用于自己学习记录
什么是堆在程序运行过程中,堆可以提供动态分配的内存,允许程序申请大小未知的内存^1。堆其实就是程序虚拟地址空间的一块连续的线性区域,它由低地址向高地址方向增长。我们一般称管理堆的那部分程序为堆管理器。
堆管理器处于用户程序与内核中间,主要做以下工作
响应用户的申请内存请求,向操作系统申请内存,然后将其返回给用户程序。同时,为了保持内存管理的高效性,内核一般都会预先分配很大的一块连续的内存,然后让堆管理器通过某种算法管理这块内存。只有当出现了堆空间不足的情况,堆管理器才会再次与操作系统进行交互。
管理用户所释放的内存。一般来说,用户释放的内存并不是直接返还给操作系统的,而是由堆管理器进行管理。这些释放的内存可以来响应用户新申请的内存的请求。
Linux 中早期的堆分配与回收由 Doug Lea 实现,但它在并行处理多个线程时,会共享进程的堆内存空间。因此,为了安全性,一个线程使用堆时,会进行加锁。然而,与此同时,加锁会导致其它线程无法使用堆,降低了内存分配和回收的高效性。同时,如果在多线程使用时,没能正确控制,也可能影 ...
静态链接程序利用
静态链接程序利用一般情况下,静态链接的程序很少出现,但是也有一些。这类 elf 的漏洞利用,主要还是依靠程序本身和用户输入。
程序本身的利用就是预留的后门函数(system)和字符串(/bin/sh)。如果有这些预留,题目难度应该不大,只要设法控制程序流到后门上。
如果没有预留的后门,很有可能是需要依靠用户输入内容结合程序本身 gadget 去构造调用,也就是手工构造 onegadget 。
正常情况下,我们会去 libc 里面找利用的函数和字符串,例如:system。但 静态链接不会到 libc 找函数,静态链接程序运行时要用到的全部东西都已经包含在 ELF 文件里,所以攻击者能利用的只有 ELF 文件的东西。ret2libc 等等攻击方法就与静态链接程序无缘。
实验一:get_started_3dsctf_2016这是一条 32 位静态链接的栈溢出题目,题目在 BUU 上有实验环境。本地和远程是采用两种解决方法。
本地就是可以利用预留的后门解决,远程利用需要结合 ELF 里的一个函数——mprotect 和 用户输入内容。
分析保护情况32 位只开启了 NX
Arch: ...
基于 C51 芯片单片机简易交通灯设计
前言单片机期末课程设计搞了一个最简单的交通灯,大概记录一下。
概要设计
详细设计初始化定时器&外部中断
TMOD=0X11 定时器模式 1 ,组成一个 16 位的定时器
晶振频率为 11.0592M 时,定时 50ms 的初值为 0x4c、0x00 :
1234TH1=0x4C; //TH1重赋初值;11.0592m晶振50msTL1=0X00;TH0=0x4C; //TH0重赋初值;11.0592m晶振50msTL0=0X00;
启动定时0、定时1:TCON=0X50
开总中断;定时器1中断开启;开外部中断1;定时器0中断开启;开外部中断:IE=0x8F
初始化信号灯开关、时间:
123P2=0Xc3; //开始默认状态,东西绿灯,南北黄灯sec_nb=35; //南北方向初始时间sec_dx=30;
程序主循环倒计时处理部分放在定时器中断服务中,buf 中的数字会不断刷新,主函数只需循环调用显示函数,显示倒计时。除此之外还判断是否进入特殊模式,特殊模式标志位是由外部中断修改:
123456789void main ...
2020第五空间部分Writeup
twice分析保护情况12345Arch: amd64-64-littleRELRO: Partial RELROStack: Canary foundNX: NX enabledPIE: No PIE (0x400000)
漏洞函数程序一共有两次输入的机会,第一次输入长度为 0x50+9 ;第二次输入长度为:0x50+0x20 。存储字符串的变量 s 距离 rbp 是 0x60 ,也就是第二次输入是栈溢出,溢出长度仅可覆盖 rip 。
输入处理函数:
12345678910111213141516171819202122232425262728__int64 __fastcall sub_4007A9(int a1){ unsigned int v2; // [rsp+14h] [rbp-6Ch] int length; // [rsp+18h] [rbp-68h] int v4; // [rsp+1Ch] [rbp-64h] char s[88]; // [rsp+20h] [rbp-60h] unsigned __i ...
2020 RedpwnCTF Writeup
skywriting简单 canary 保护绕过,复盘连不上官方环境,exp 本地版本
1234567891011121314151617181920212223242526272829303132333435#!/usr/bin/env python# -*- coding: utf-8 -*-# @Author : MrSkYe# @Email : [email protected]# @File : skywriting.pyfrom pwn import *context.log_level = 'debug'p = process("./skywriting")elf = ELF("./skywriting")libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")p.sendlineafter("sky?","1")p.sendafter("shot: ","a"*0 ...
花式栈溢出技巧
花式栈溢出技巧stack pivoting原理劫持栈指针指向攻击者所能控制的内存处,然后再在相应的位置进行 ROP。
eip 的值是通过 esp 与 ret 指令压入。退出函数时,先执行 leave ,让 esp 指向 ebp ,然后 esp 加一个机器字长后,执行 ret 指令,将 esp 指向的值压入 eip 中。
可能在以下情况需要使用 stack pivoting
可以控制的栈溢出的字节数较少,难以构造较长的 ROP 链
开启了 PIE 保护,栈地址未知,我们可以将栈劫持到已知的区域。
其它漏洞难以利用,我们需要进行转换,比如说将栈劫持到堆空间,从而在堆上写 rop 及进行堆漏洞利用
使用条件利用 stack pivoting 有以下几个要求
可以控制程序执行流。
可以控制 sp 指针(栈顶指针)。一般来说,控制栈指针会使用 ROP,常见的控制栈指针的 gadgets 一般是
1pop rsp/esp
当然,还会有一些其它的姿势。比如说 libc_csu_init 中的 gadgets,我们通过偏移就可以得到控制 rsp 指针。上面的是正常的,下面的是 ...
DozerCTF Writeup
pwn - ret2 temp
一开始记得不是这个题目名字,应该是 ret2dl-resolve ,高大上东西不会
分析保护情况32 位动态链接;打开 NX ;
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
漏洞函数read 函数栈溢出
1234567ssize_t vuln(){ char buf; // [esp+Ch] [ebp-6Ch] setbuf(stdin, &buf); return read(0, &buf, 0x100u);}
思路泄露 libc栈溢出,用 write 泄露 libc 地址:
12payload = 'a'*0x6c+p32(0xdeadbeef)payload += p32(write_plt) + p32(main_addr) + p32(1) + p32(write_got) ...
格式化字符串漏洞基础利用
格式化字符串漏洞基础利用
阅读 ctf-wiki 后总结
泄露内存利用格式化字符串漏洞,我们还可以获取我们所想要输出的内容。一般会有如下几种操作
泄露栈内存
获取某个变量的值
获取某个变量对应地址的内存
泄露任意地址内存
利用 GOT 表得到 libc 函数地址,进而获取 libc,进而获取其它 libc 函数地址
盲打,dump 整个程序,获取有用信息。
简单的泄露栈内存例如,给定如下程序
12345678910#include <stdio.h># file:leakmemory.cint main() { char s[100]; int a = 1, b = 0x22222222, c = -1; scanf("%s", s); printf("%08x.%08x.%08x.%s\n", a, b, c, s); printf(s); //格式化字符串漏洞 return 0;}
32 位程序使用的是栈传参,64 位系统前 7 个参数是用寄存器传参。32 位程序可以直接利用格式化字 ...
格式化字符串漏洞基础例子
格式化字符串漏洞基础例子
绝大部分内容来自 CTF-WIKI ,内容引用用于学习记录
64 位程序格式化字符串漏洞原理其实 64 位的偏移计算和 32 位类似,都是算对应的参数。只不过 64 位函数的前 6 个参数是存储在相应的寄存器中的。那么在格式化字符串漏洞中呢?虽然我们并没有向相应寄存器中放入数据,但是程序依旧会按照格式化字符串的相应格式对其进行解析。
例子确定保护这里,我们以 2017 年的 UIUCTF 中 pwn200 GoodLuck 为例进行介绍。这里由于只有本地环境,所以我在本地设置了一个 flag.txt 文件。
123456➜ 2017-UIUCTF-pwn200-GoodLuck git:(master) ✗ checksec goodluck Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000)
可以看出程序开启了 Canary、NX 保 ...