PWN技巧-其他
换库strings libc.so.6 | grep 'ubuntu'#Ubuntu GLIBC 2.35-0ubuntu3.8#Ubuntu GLIBC 2.23-0ubuntu11.3./download 2.23-0ubuntu11.3_amd64patchelf --set-interpreter /home/zechariah/glibc-all-in-one/libs/2.35-0ubuntu3.9_amd64/ld-linux-x86-64.so.2 filenamepatchelf --replace-needed libc.so.6 ./libc.so.6 filename Capstone字节码转汇编代码from capstone import *shellcode_x86 = b"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"shellcode_x86 += b"\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"shellcode_x86 ...
一般流程与exp板子
一般流程chmod u+xchecksecsudo -s echo 0 > /proc/sys/kernel/randomize_va_spacesudo vmhgfs-fuse .host:/ /mnt/hgfs -o subtype=vmhgfs-fuse,allow_other Chromium OS Docs - Linux System Call Table 泄露libclibc database search 系统调用Chromium OS Docs - Linux System Call Table速查源码Glibc source code (glibc-2.41.9000) - Bootlin Elixir Cross Referencer 编写expfrom pwn import *context(os='linux', arch='amd64', log_level='debug')context.terminal = ["tmux", "splitw",...
PWN基础-汇编(字节序寄存器-传参-指令速查)
寄存器字节序又称 端序 或 尾序(英语中用单词:Endianness 表示)。在计算机领域中,指电脑内存中 占用多个字节的数据的字节 在 内存中的排列顺序。 大端序(Big-Endian)将数据的低位字节存放在内存的高位地址,高位字节存放在低位地址。这种排列方式与数据用字节表示时的书写顺序一致,符合人类的阅读习惯。 小端序(Little-Endian),将一个多位数的低位放在较小的地址处,高位放在较大的地址处,则称小端序。小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的。 为什么会有字节序,统一用大端序不行吗?答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。在计算机内部,小端序被广泛应用于现代 CPU 内部存储数据;而在其他场景,比如网络传输和文件存储则使用大端序。内存中的多字节数据相对于内存地址有大端和小端之分 , 磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分 。 网络数据流同样有大端小端之分 , 也就是说,当接收端收到第...
Art_of_shellcode
很有用的网址https://www.exploit-db.com/shellcodes https://v3rdant.cn/Pwn.The-Art-of-Shellcode/ PWN:手动编写 x64 基于syscall 的 shell code(TODO)_x64 syscall pwn-CSDN博客
进阶ROP
进阶ROPret2__libc_csu_init(64位ELF)利用原理在64位程序中,函数的前6个参数是通过寄存器传递的,但是大多数时候,我们很难找到每一个寄存器对应的gadgets。 这时候,我们可以利用x64下的__libc_scu_init中的gadgets。这个函数是用来对libc进行初始化操作的,而一般的程序都会调用libc函数,所以这个函数一定会存在。我们先来看一下这个函数: libc_csu_init利用方法:.text:00000000004005C0 ; void _libc_csu_init(void).text:00000000004005C0 public __libc_csu_init.text:00000000004005C0 __libc_csu_init proc near ; DATA XREF: _start+16↑o.text:00000000004005C0 ; __unwind {.text:00000000004005C0 push ...
PWN技巧-栈迁移
栈迁移原理介绍与应用 - Max1z - 博客园 介绍我们首先介绍一下Stack pivoting的含义:该技巧就是劫持栈指针指向攻击者所能控制的内存处,然后再在相应的位置进行ROP。一般来说,我们可能在以下情况需要使用stack pivoting: 可以控制的栈溢出的字节数较少,难以构造较长的ROP链 开启了PIE保护,栈地址未知,我们可以将栈劫持到已知的区域。 其它漏洞难以利用,我们需要进行转换,比如说将栈劫持到堆空间,从而在堆上写rop及进行堆漏洞利用此外,利用 stack pivoting有以下几个要求: 可以控制程序执行流 可以控制sp指针。一般来说,控制栈指针会使用ROP,常见的控制栈指针的gadgets一般是pop rsp/esp当然,还会有一些其它的姿势。比如说libc_csu_init中的gadgets,我们通过偏移就可以得到控制rsp指针上面是正常的,下面是偏移的此外,还有更加高级的 fake frame 存在可以控制内容的内存,一般有如下 bss段。由于进程按页分配内存,分配给bss段的内存大小至少一个页(4k,0x1000)大小。然而一般bss段的内容用...
PWN入门-整数溢出
基本数据类型再说整数溢出之前,我们首先的先来说一下C语言中的整型的数据分类。按数据类型分类主要分三类:短整型(short)、整型(int)、长整型(long)按符号分类:有符号、无符号并且每种数据类型都有自己的大小范围整形: #include <stdio.h>int main(){ unsigned short int a = 1; unsigned short int b = 65537; if(a == b){ printf("Int overflow successfully!\n"); } return 0;} 编译gcc -g test.c -o test运行一下程序输出Int overflow successfully!unsigned short int的范围是0~65535,对变量b的赋值超过了这个范围,因此hex的数据最高位被截断,从而变成了0x0001=1 示例XCTF攻防世界int_overflow - 吾爱破解 - 52pojie.cn只...
PWN技巧-栈对齐
(Ubuntu 18.04版本及以上需考虑 ) 罪魁祸首movaps xmmword ptr [rsp + 0x50], xmm0 从 https://www.felixcloutier.com/x86/movaps 处我们可以知道,这条指令的功能是: 将xmm0中保存的单精度浮点数从xmm0移动至地址[rsp + 0x50]处 。 当然,更重要的是这条指令的执行条件,这直接关系到程序报错的原因。原文中对执行条件的描述如下: When the source or destination operand is a memory operand, the operand must be aligned on a 16-byte (128-bit version), 32-byte (VEX.256 encoded version) or 64-byte (EVEX.512 encoded version) boundary or a general-protection exception (#GP) will be generated. 此时报错的原因就显而易见了:当内存地址作...
AWD学习
AWD流程 改init_hosts.py中的ip格式和port 改submit_flag.py中的提交方式和token 改round_wait_time patch 写exp 批量攻击 扫描IPimport requestsimport threading li = lambda x : print('\x1b[01;38;5;214m' + x + '\x1b[0m')ll = lambda x : print('\x1b[01;38;5;1m' + x + '\x1b[0m') def check_ip(i): try: url = f'http://192-168-1-{i}.awd.bugku.cn/' #* response = requests.get(url, timeout=0.5) if response.status_code == 200: li('[+] &...
C语言函数原型整理
system当system函数执行的时候会利用到rdi里的参数 writewrite(1,write_got,8)是把write_got地址指向内存的内容的前8个字节写入到标准输出流中。ssize_t write(int fd, const void *buf, size_t count)参数说明:fd:文件描述符,表示要写入数据的文件或设备。文件描述符是一个整数,通常是由open系统调用返回的。例如,0表示标准输入(stdin),1表示标准输出(stdout),2表示标准错误(stderr)。buf:指向要写入数据的缓冲区的指针。这个指针可以是任何类型的数据,因为它是void类型的。count:要写入的字节数。函数会尝试从buf中写入count个字节的数据。返回值:正整数:表示成功写入的字节数,可能会小于count(例如,由于磁盘已满等原因)。0:表示没有写入任何数据。-1:表示发生错误,并设置`errno`来提供进一步的错误信息。 readssize_t read(int fd,void*buf,size_t count)参数说明:fd:是文件描述符buf:...
