【WP】adworld之pwn新手区string
题目描述查看保护
主函数,开始时设置了一个定时器sub_400996()函数,画了一个龙动态分配8字节内存并把首地址返回给v3把v3的值赋给v4令v3[0] = 68令v3[1] = 85(低四位赋值68,高四位赋值85)分别输出v3[0]和v3[1]的地址以v3为参数执行sub_400D72
进入sub_400D72函数看到输入的名字需要少于0xc=12个字节接下来分别进入三个函数
进入sub_400A7D函数根据下面的判断发现只能输入east,否则程序结束
返回并继续向下进入sub_400BB9函数当输入1时,可以输入一个整数和一个字符串这里存在一处格式化字符串漏洞先接着看下一个函数
进入sub_400CA6((_DWORD *)a1)函数,这里的参数a1就是主函数的v4也就是v3[0]的地址可以看到当v3[0] == v3[1]的时候才能执行后续指令而由前面的赋值可知原本两数不相等所以需要用到上个函数里的格式化字符串漏洞来覆盖其中的一个值满足条件这里需要说明:
mmap函数,用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写
1void *mmap(v ...
【WP】BUUCTF之not_the_same_3dsctf_2016
题目描述
看一下保护
IDA看一眼,明显是栈溢出漏洞
似乎跳转到这里可以,但是远端打不通
发现有函数mprotect,可以通过其修改一段指定内存区域的保护属性(变成rwx,可读可写可执行),从而填充shellcode拿到shell
mprotect函数原型如下:1234int mprotect(const void* start, size_t len, int prot);- void* start: 区段开始位置- size_t len: 区段的大小- int prot:区段的权限(可以用8进制来表示)注意:
当prot = 7 = 4+2+1 为可读(4)可写(2)可执行(1)
mprotect以页为单位,一页为0x1000字节,需要长度对齐,简单来说起始地址必须是0x1000的倍数才能分配成功
exp1234567891011121314151617from pwn import *io = process('./p')elf = ELF("./p")mpr_addr=elf.symbols['mprotect' ...
intermediateROP
ret2csu原理我们知道64位程序中函数的前六个参数时通过寄存器传递的,一次保存在rdi,rsi,rdx,rcx,r8和r9中,如果有更多参数才会保存在栈上但当我们需要多个参数时,很难找到每一个寄存器对应的gadget,这时候我们可以利用x64下的__libc_csu_init中的gadget。这个函数时用来对libc进行初始化操作的,而一般的程序都会调用libc函数,所以这个函数一定会存在。函数具体如下(不同版本可能略有区别)
这里通常利用两段gadgetgadget11234567.text:00000000004011E2 pop rbx.text:00000000004011E3 pop rbp.text:00000000004011E4 pop r12.text:00000000004011E6 pop r13.text:00000000004011E8 pop r14.tex ...
Python学习笔记
数python中有4种数——整数、长整数、浮点数、复数整数 2长整数 比整数大的整数浮点数 3.23 52.3E-4复数 -5+4j 2.3-4.6j
字符串使用单引号(’)你可以用单引号指示字符串,就如同’Quote me on this’这样。所有的空白,即空格和制表符都照原样保留。
使用双引号(”)在双引号中的字符串与单引号中的字符串的使用完全相同,例如”What’s your name?”。
使用三引号(’’’或”””)利用三引号,你可以指示一个多行的字符串。你可以在三引号中自由的使用单引号和双引号。例如:‘’’This is a multi-line string. This is the first line.This is the second line.“What’s your name?,” I asked.He said “Bond, James Bond.”‘’’
转义符在字符串中包含‘,
用\’,eg what’s your name ——> ‘what\’s your name’
”what’s your name”在双引号中表示双引号,也需要反 ...
格式化字符串漏洞
格式化字符串常见语法%d 打印signed int%u 打印unsigned int%x 打印hex形式整数%p 打印指针(地址),void*
%s 打印参数地址处的字符串
常见于以下函数
常见利用方式%<正整数n> 打印宽度为n的字符串(打印长度为n)
%n 将当前已打印字符的个数(4字节)写入参数地址处%hn 写入2字节%hhn 写入1字节 【h short】
eg.
printf(“%10c%n”, 0x41, 0x41414141);打印9个空格加上1个A ,所以会往地址0x41414141处写入10(4字节)【10是对应的n前的字符个数】
printf(“%1337c%hhn”, 0x41, 0x804a000);1337=0x59, 又%hhn, 所以往地址0x804a000处写入1字节0x39【一个字节存储0~225】【因为1字节等于8bit,2^8-1】
%<正整数n>$ 指定占位符对应第n个参数,如%12$x 此处%x对应第12个参数eg.printf(“0x2$x:0x%1$x\n”, 0xdeadbeef, 0xcafebabe) ...
延迟绑定与PLT&GOT
Linux动态链接一个比喻:发布的文章里复制别人的文字,属于静态链接。给出别人文章的链接,属于动态链接。Linux下的动态链接是通过PLT&GOT 来实现的动态链接每个函数需要两个东西:1.用来存放外部函数地址的数据段2.用来获取数据段记录的外部函数地址的代码对应两个表。存放外部的函数地址的数据表为GOT表;存放额外代码的表为PLT表
动态链接的好处
节省内存和磁盘空间假设磁盘中两个程序都包含lib.o模块,静态链接情况下,两个可执行文件都会包含该模块,造成了磁盘空间的浪费。而两个程序运行时,内存空间也会包含这两个相同的模块,造成内存的浪费。动态链接情况下,运行程序时,如果系统发现lib.o模块已经存在,就会将模块和程序链接起来,节省内存。
程序更新更简单静态链接时需要更新lib.o文件,第三方要把新版本的lib.o和程序重新链接好后发送给用户。动态链接时需要更新lib.o文件时,只需要覆盖原有的文件,在程序下一次运行时,会把新版本的目标文件装载到内存中并链接起来,就完成了更新。
程序扩展性和兼容性更强动态链接的程序在运行时可以动态地选择加载各种模块,也就是我们常常使用的插件。 ...
栈
数据结构中, 栈是限定仅在表尾进行插入或删除操作的线性表。栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据。
计算机系统中,栈也可以称之为栈内存是一个具有动态内存区域,存储函数内部(包括main函数)的局部变量和方法调用和函数参数值,是由系统自动分配的,一般速度较快;存储地址是连续且存在有限栈容量,会出现溢出现象。程序可以将数据压入栈中,也可以将数据从栈顶弹出。压栈操作使得栈增大,而弹出操作使栈减小。栈用于维护函数调用的上下文,离开了栈函数调用就没法实现。
栈桢每一次函数的调用,都会在调用栈(call stack)上维护一个独立的栈帧(stack frame).每个独立的栈帧一般包括:
函数的返回地址和参数
临时变量: 包括函数的非静态局部变量以及编译器自动生成的其他临时变量
函数调用的上下文栈是从高地址向低地址延伸,一个函数的栈帧用ebp 和 esp 这两个寄存器来划定范围.ebp 指向当前 的栈帧的底部,esp 始终指向栈帧的顶部;ebp 寄存器又被称为帧指针(Frame Pointer);esp 寄 ...
PWN入门之汇编框架
32位与64位
amd64: 64位AMD64,或“x64”,是一种64位元的电脑处理器架构。它是基于现有32位元的x86架构
i386:——intel 80386 32位, 通常作为intel32位微处理器(cpu)的统称
X86架构(The X86 architecture) 是微处理器执行的计算机语言指令集,指一个intel通用计算机系列的标准编号缩写,也标识一套通用的计算机指令集合。“x86-64”1999由AMD设计,AMD 首次公开 64 位集以扩充给 IA-32,称为 x86-64(后来改名为 AMD64)。 AMD64架构在IA-32上新增了64位寄存器,并兼容早期的16位和32位软件,可使现有以x86为对象的编译器容易转为AMD64版本。
基础汇编指令12345678910111213141516MOV EAX,ECX EAX = ECXADD EAX,ECX EAX+=ECXSUB EAX,ECX EAX-=ECXINC EAX EAX++DEC EAX EAX—LEA EAX,[ECX+ ...
PWN入门之cpu工作原理
一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
内部总线实现CPU内部各个器件之间的联系。外部总线实现CPU和主板上其它器件的联系。
寄存器8086CPU有14个寄存器 它们的名称为:AX、BX、CX、DXSI、DISP、BPIP、PSWCS、SS、DS、ES
当所保存数据大于寄存器位数时,高位的数据会丢失,称为数据溢出当两个通用寄存器作8位独立寄存器使用,低8位与高8位之间没有直接关系,不能发生进位1个8位寄存器能存储的最大数据:2^8-1
字在寄存器的存储
物理地址 CPU访问内存单元时要给出内存单元的地址,所有的内存单元构成的存储空间是一个一维的线性空间。我们将这个唯一的地址称为物理地址。不同的CPU有不同的形成物理地址的方式。
16位结构的cpu:
Intel8060内部16位结构,只能传送16位地址,寻址能力64k;外部有20位地址总线,可传20位地址,寻址能力1M。
如何从16位转化为20位呢?8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。段地址+偏移地址 -> 地址加法器 -> 20位的物 ...












