实际上 MinGW 并不是一个 单纯的C/C++ 编译器,而是一套 GNU 工具集合。除开 GCC 以外,MinGW 还包含有一些其他的 GNU 程序开发工具 (比如 gawk bison 等等)。
开发 MinGW 是为了那些不喜欢工作在 Linux(FreeBSD) *** 作系统而留在 Windows 的人提供一套符合 GNU 的 GNU 工作环境。
所以,使用 MinGW 我们就可以像在 Linux 下一样使用 GNU 程序开发工具。
GCC 就是 MinGW 的核心所在,GCC 是一套支持众多计算机程序语言的编译系统,而且在语言标准的实现上是最接近于标准的。并且 GCC
几乎可以移植到目前所有可用的计算机平台。(我的电脑上就还装有 DevKitPro,里面包含
内存主要分为代码段,数据段和堆栈。代码段放程序代码,属于只读内存。数据段存放全局变量,静态变量,常量等,堆里存放自己malloc或new出来的变量,其他变量就存放在栈里,堆栈之间空间是有浮动的。数据段的内存会到程序执行完才释放。调用函数先找到函数的入口地址,然后计算给函数的形参和临时变量在栈里分配空间,拷贝实参的副本传给形参,然后进行压栈 *** 作,函数执行完再进行d栈 *** 作。字符常量一般放在数据段,而且相同的字符常量只会存一份
硬件平台是什么?pc上还是51上或者arm,mips?不
同硬件平台汇编不同,编译器对程序的处理也就不同。
用汇编一般都是考虑到可以直接访问寄存器,速度有优势,但最大的缺点是不能跨平台,可移植性很差。
伪指令是合法的MIPS汇编语言指令,没有直接的硬件实现。它们是为了方便程序员而提供的。当你在MIPS汇编语言程序中使用伪指令时,汇编器将它们转换为等效的真正的MIPS指令。
例如:
得到字符串长度,存入寄存器以计数,得到最后一个字符的地址,将最后一个字符移到新串的第一的位置,地址减一,字串长度计数器减一,判断计数器是否为0,不为0,重复移动字符,为零退出循环
然后按顺序显示字符串的方式显示
安装可以参考我写的另一篇文章,不过也就几条命令。 链接
使用 from pwn import 将所有的模块导入到当前namespace,这条语句还会帮你把os,sys等常用的系统库导入。
常用模块如下:
汇编:
可以使用context来指定cpu类型以及 *** 作系统
使用disasm进行反汇编
注意,asm需要binutils中的as工具辅助,如果是不同于本机平台的其他平台的汇编,例如在我的x86机器上进行mips的汇编就会出现as工具未找到的情况,这时候需要安装其他平台的cross-binutils。
结合asm可以可以得到最终的pyaload。
除了直接执行sh之外,还可以进行其它的一些常用 *** 作例如提权、反向连接等等。
pack:p32,p64
unpack:u32,u64
使用ROP(elf)来产生一个rop的对象,这时rop链还是空的,需要在其中添加函数。
因为ROP对象实现了 getattr 的功能,可以直接通过func call的形式来添加函数,ropread(0, elfbss(0x80))实际相当于ropcall('read', (0, elfbss(0x80)))。
通过多次添加函数调用,最后使用str将整个rop chain dump出来就可以了。
Exploit利器——Pwntools
pwntools官网
把C语言代码转换为MIPS:
以下是c语言代码:
while (candidate_gcd <= min)
{
if (((a mod candidate_gcd) == 0) &&((b mod candidate_gcd) ==
0))
{
current_gcd = candidate_gcd;
}
candidate_gcd = candidate_gcd + 1;
}
以下为转换为mips后的代码:
首先设置变量:
candidate_gcd = $t0
min = $t1
a mod candidate_gcd = $t2
b mod candidate_gcd = $t3
current_gcd = $t4
$t6 = 0
$t5
代码如下:(绿色为注释)
Label3: //设置标签Label3
ble $t0,$t1,Label //当$t0 小于等于$t1 时,跳到标签Label
Label: //设置标签Label
Add $t5,$t2,$t3 //将$t2 和$t3 相加赋值给$t5
Li $t6,0 //给$t6 赋值为0
Leq $t5, $t6,Label1 //判断如果$t6=$t5=0,跳到标签Label1
Label1: //设置标签Label1
Move $t4, $t0 //$t4=$t0
Addi $t0, $t0,1 //$t0=$t0+1(自加加)
J Label3 //跳到标签Label3,这里其实就是实现c 语言
中的while 无限循环
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)