Month: February 2019

南京邮电大学网络攻防训练平台 RE方向 第四题 WxyVM

环境配置 系统 : Windows xp / kali 64bit 程序 : WxyVM 要求 : 输入口令 使用工具 :IDA 开始分析 用ida直接载入程序,加载完毕后按下Shift+F12显示字符串窗口: .rodata:0000000000400848 0000000E C [WxyVM 0.0.1] .rodata:0000000000400856 00000011 C input your flag: .rodata:000000000040086A 00000008 C correct .rodata:0000000000400872 00000006 C wrong .eh_frame:000000000040091F 00000006 C ;*3$\” 这里双击input your flag:然后选择代码交叉引用,定位到程序验证逻辑处: __int64 __fastcall main(__int64 a1, char **a2, char **a3) { char IsOK; […]

sqlmap简单应用

在网页的搜索编辑框中输入数据并抓包,将http的request请求复制到txt文档里。然后启动sqlmap, 查看是否有注入点: python sqlmap.py -r “C:\Documents and Settings\Administrator\桌面\123.txt” — Parameter: id (GET) Type: boolean-based blind Title: AND boolean-based blind – WHERE or HAVING clause Payload: id=1′ AND 6501=6501 AND ‘eWGw’=’eWGw&Submit=Submit Type: error-based Title: MySQL >= 5.0 AND error-based – WHERE, HAVING, ORDER BY or GROUP BY cl ause Payload: id=1’ AND (SELECT 1763 FROM(SELECT COUNT(*),CONCAT(0x71716a7871,(SE […]

《0day安全:软件漏洞分析技术》读书笔记

漏洞 功能性逻辑缺陷 影响软件的正常功能,例如,执行结果错误,图标显示错误等。 安全性逻辑缺陷 通常情况下不影响软件的正常功能,但被攻击者成功利用后,有可能引起软件去执行额外的恶意代码。常见的漏洞包括软件中的缓冲区溢出漏洞,网站中的跨站脚本漏洞(xss),sql注入漏洞。 栈溢出漏洞 程序中没有对参数长度进行限制,导致数据在栈中溢出,覆盖掉ebp寄存器,函数返回地址等重要位置,这可能引发代码执行。 原理 在一个完整函数调用中,通常包含以下过程: 1.调用阶段:压入参数、函数返回地址、 2.执行阶段:保存现场,用esp指向栈顶,ebp指向栈底。进行一系列操作后,还原现场。ret返回。 3.获取结果:将eax或者保存在其他内存或寄存器中的结果取出。 在第二阶段,程序若是接受了过长的参数,则可能突破原有的界限。数据在栈中是向下增长的,那么就可能覆盖掉下方的函数返回地址。 第三章 开发shellcode的艺术。 shellcode这个专用术语来通称缓冲区溢出攻击中植入进程的代码。shellcode往往需要汇编语言编写,并转换成二进制机器码,其内容和长度还会受到很多苛刻限制,故开发和调试难度很高。 shellcode在内存中的地址是动态变化,简单的函数返回地址覆盖为固定值往往不能奏效。 在函数跳转到函数返回地址所设置的shellcode首部后,esp寄存器指向的是函数返回地址的后一位置。 在程序中搜索jmp esp/eax/ebx/esi (od插件OllyUni.dll),再填入该指令的地址到函数返回位置。预先布置好函数返回地址下面的shellcode内容,这样就可以利用“跳板”精确地跳回栈区。 缓冲区中,shellcode的组织方式有三种: 1. 静态地填充函数返回地址 2. jmp esp方式精确定位栈区 3. jmp esp方式跳入函数返回地址下方,再jmp esp-x,回到shellcode首部。 * 注意shellcode中push指令有破坏shellcode自身的风险,所以在有控制权后,要抬高栈顶。 在实际运用中,为了shellcode的通用性考虑,需要为Shellcode开发动态获取API函数地址的功能。 第五章 堆溢出利用 堆是由操作系统管理的内存,程序员用时需要向操作系统申请,使用后需要释放内存,并将指向堆内存的指针指向null。 在windows系统中,占用态的堆块被使用它的程序索引,堆表只索引所有空闲态的堆块。其中,最重要的堆表有两种:空闲双向链表Freelist(简称空表),和快速单向链表Lookaside(简称快表)。 管理堆内存的方式和具体的操作系统版本有很大关联,在分析时要格外注意。 空表初始化时的状态 只有空闲的大块,这个块被称作“尾块”。 Freelist[0] 位于堆偏移0x178处。 尾块位于0x688处(启动快表后这个位置将是快表)。 Freelist[0]指向“尾块” 空表中除了第一个元素,其余各项索引都指向自己,这意味着其余所有空闲链表中都设有空闲块。 占用态堆块结构和空闲态堆块结构的区别 结构基本一致,区别在于在空闲堆块内存在两个指针,分别指向上一个节点(Flink in freelist)和下一个节点(Blink in freelist)。 堆块的分配 堆块的大小包括了块首在内,即如果请求32字节,实际会分配的堆块为40字节:8字节块首+32字节块身。 堆块的单位是八字节,不足八字节的部分按照八字节分配。 […]