安全措施 程序分析 首先是初始化程序,将 puts 放在了 bss 段 0x4088 的位置,具体查看汇编发现是直接把 puts 的函数地址放进去了。 主程序先接受一个 name 存在 0x4068 位置,然后执行 4 个选项的菜单循环。 选项 1、2、3 分别能够通过 +、-、^ 操作 0x40a0 之前的内存;选项 4 调用 0x4088 位置…
Linux 有一套规则来命名系统中的每一个共享库,它规定共享库的文件命名规则如下:libname.so.x.y.z,即前缀"lib"+库名称+后缀".so"+三个数字组成的版本号,其中,x 表示主版本号,y 表示次版本号,z 表示发布版本号。SO-NAME 命名机制,就是把共享库的文件名去掉次版本号和发布版本号,只保留主版本号。在 Linux 系统中,系统会为每个共享库在它所在的目录创建一个跟它的 ”SO-NAME” 一样的软链接指向它。
思路 通过输出printf地址泄露libc 覆盖printf地址为system 输出/bin/sh 分析 检查安全措施,没有PIE和canary [*] '/mnt/e/sec/bugku/pwn/repeater/pwn7' Arch: i386-32-little RELRO: Partial RELRO Stack: No…
思路 列出可用集,根据可用集逐步构造出全指令集 根据可用集逐步编码shellcode 看了别的师傅有很巧妙的做法:不直接调shell,而是先手写调read,然后输入真正的shellcode,绕过检测。 我这里主要借机学习一下shellcode编码,就按官方思路复现了。 指令集扩展 shellcode字符集 编写一个基础的shellcode: mov…
shellcode原理 系统调用execve("/bin/sh", 0, 0) 具体可以参考系统调用表、64位linux中断向量表 64位 寄存器: rax = 0x3b rdi = "/bin/sh" rsi = 0 rdx = 0 一段简单的 shellcode: mov rax, 0x68732f6e6…
这题拖了挺久的,因为一些知识点还不是很明白。 分析过程 checksec 保护全开 [*] '/mnt/e/sec/dasctf/ez_note/pwn' Arch: amd64-64-little RELRO: Full RELRO Stack: Canary found NX: NX enabled PIE: PIE ena…
在glibc源码中搜索split可以找到堆块切割相关源码 在malloc.c的_int_malloc函数中发生堆块切割的情形如下: 遍历unsorted chunks时 请求满足small request last remainder 堆块是唯一堆块,且切割后剩下的仍然满足最小堆块大小 从largebin中找到最小的满足要求的堆块 切割后剩余堆块的…
NX: No Exection gcc -z execstack Canary: defeat bof, 在 return 前做 canary check - security_init() => fs:0x28 (stack guard) - canary end with \x00 gcc -fno-stack-protector: no…
为了能够调用函数,需要有一种公认的方式来传递参数。 如果程序是完全独立的二进制文件,编译器可以自由决定调用约定。 然而在现实中,会使用共享库(例如 libc)以便公共代码可以只存储一次并动态链接到需要它的程序,从而减少程序大小。 在 Linux 二进制文件中,实际上只有两种常用的调用约定:cdecl 用于 32 位,SysV 用于 64 位。 cd…
我的第一道沙盒题(竟然不能get shell!!!),主要考察栈帧分配(构造rop链)。顺便学了下pwntools rop的接口,还是挺香的。 我喜欢轮子,exp里会用比较多的轮子,建议看最终exp。 分析过程 栈帧复用 func里面写入的栈帧在check里面复用,通过检测。 io.sendafter(b'identity', …