能力值:
( LV2,RANK:10 )
|
-
-
2 楼
谁告诉我Jmp ESP是什么。。。
|
能力值:
( LV3,RANK:20 )
|
-
-
3 楼
看你的意思是你已经控制eip了,那你看看有没有别的寄存器指向shellcode,并不一定用jmp esp,jmp eax类似的也可以啊。还有你看看附近的栈中或堆中有没有指向shellcode的地址,然后找一个类似于call [esp+N]的指令就可以了。方法很灵活,并不拘泥于jmp esp。
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
不太清楚你具体的想表达什么,可以贴一段od的汇编代码吗,最好写上注释
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
给个缓冲区溢出利用的demo
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
void func1(char* s)
{
char buf[10];
//_asm int 3
strcpy(buf, s);
}
void func2(void)
{
printf("Hacked by me.\n");
exit(0);
}
int main(int argc, char* argv[])
{
char badCode[] = "aaaabbbb2222cccc4444ffff";
DWORD* pEIP = (DWORD*)&badCode[16];
*pEIP = (DWORD)func2; //func2函数指针,低位字节不能是0,这里不保证
//*pEIP = (DWORD)shellcode;
func1(badCode);
return 0;
}
|
能力值:
( LV4,RANK:50 )
|
-
-
6 楼
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
我晕,百度图片居然直接显示不了。不过右键复制图片网址是可以访问的。
|
能力值:
( LV3,RANK:30 )
|
-
-
8 楼
大哥,你这个是标准的栈溢出,我的溢出环境比你这个复杂多了啊,如果这么简单,我也不愁了啊
|
能力值:
( LV3,RANK:30 )
|
-
-
9 楼
[QUOTE=hai海豚;1245799]看你的意思是你已经控制eip了,那你看看有没有别的寄存器指向shellcode,并不一定用jmp esp,jmp eax类似的也可以啊。还有你看看附近的栈中或堆中有没有指向shellcode的地址,然后找一个类似于call [esp+N]的指令就可以了。方法很灵活,并不拘泥于jmp esp。[/QUOTE]
控制了这个位置,奇葩不?而且还是USER32里,实际没控制EIP,但是可以从这边的call进入JMP ESP,问题是从这里进入 JMP ESP之后,改怎么办,shellcode在内存里,跟任何寄存器里的指针都相距甚远,应该没有任何关联
|
能力值:
( LV3,RANK:30 )
|
-
-
10 楼
据我的理解(我是超级菜逼,理解的未必正确),这个地方是栈溢出,虽然在memcpy的时候造成了溢出,但是没有立即产生影响,一直到后面的代码使用栈的时候才出现问题,可是后面出现问题的地方只使用4字节的栈(不包括栈结构),这样没办法大面积覆盖
有问题的源代码如下,这个是Gh0st远控的溢出,源代码网上都有:
CFileManagerDlg::CFileManagerDlg(CWnd* pParent, CIOCPServer* pIOCPServer, ClientContext *pContext)
: CDialog(CFileManagerDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CFileManagerDlg)
//}}AFX_DATA_INIT
SHFILEINFO sfi;
SHGetFileInfo
(
"\\\\",
FILE_ATTRIBUTE_NORMAL,
&sfi,
sizeof(SHFILEINFO),
SHGFI_ICON | SHGFI_USEFILEATTRIBUTES
);
m_hIcon = sfi.hIcon;
HIMAGELIST hImageList;
// 加载系统图标列表
hImageList = (HIMAGELIST)SHGetFileInfo
(
NULL,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_LARGEICON | SHGFI_SYSICONINDEX
);
m_pImageList_Large = CImageList::FromHandle(hImageList);
// 加载系统图标列表
hImageList = (HIMAGELIST)SHGetFileInfo
(
NULL,
0,
&sfi,
sizeof(SHFILEINFO),
SHGFI_SMALLICON | SHGFI_SYSICONINDEX
);
m_pImageList_Small = CImageList::FromHandle(hImageList);
// 初始化应该传输的数据包大小为0
m_iocpServer = pIOCPServer;
m_pContext = pContext;
sockaddr_in sockAddr;
memset(&sockAddr, 0, sizeof(sockAddr));
int nSockAddrLen = sizeof(sockAddr);
BOOL bResult = getpeername(m_pContext->m_Socket,(SOCKADDR*)&sockAddr, &nSockAddrLen);
m_IPAddress = bResult != INVALID_SOCKET ? inet_ntoa(sockAddr.sin_addr) : "";
// 保存远程驱动器列表
memset(m_bRemoteDriveList, 0, sizeof(m_bRemoteDriveList));
[COLOR="Red"] memcpy(m_bRemoteDriveList, m_pContext->m_DeCompressionBuffer.GetBuffer(1), m_pContext->m_DeCompressionBuffer.GetBufferLen() - 1);[/COLOR]
[COLOR="SeaGreen"]//m_bRemoteDriveList的定义是 BYTE m_bRemoteDriveList[1024];[/COLOR]
m_nTransferMode = TRANSFER_MODE_NORMAL;
m_nOperatingFileLength = 0;
m_nCounter = 0;
m_bIsStop = false;
}
|
能力值:
( LV4,RANK:50 )
|
-
-
11 楼
如果只能控制4个字节的话,shellcode都放不下吧。另外,jmp esp后是跳转到了你控制的这4个字节吗?
|
能力值:
( LV4,RANK:50 )
|
-
-
12 楼
我去找找源码
|
能力值:
( LV3,RANK:30 )
|
-
-
13 楼
没错,单单就溢出的位置看,好像真放不了shellcode,可是shellcode内存里有啊
|
能力值:
( LV4,RANK:50 )
|
-
-
14 楼
我发现你的kx好高,978个,你咋这么有钱呢
|
能力值:
( LV4,RANK:50 )
|
-
-
15 楼
你看看能不能参考这种思路,先“jmp short”到一个合适的地方,再"jmp"到一个比较远的地方。
|
能力值:
( LV3,RANK:30 )
|
-
-
16 楼
花钱买的啊,想学习,不花钱怎么搞啊
|
能力值:
( LV3,RANK:30 )
|
-
-
17 楼
老大,这尼玛差的也太远了啊,从user32领空跳到程序领空,目测不是一两次jmp short 能搞定的啊 要不我给你源码,给你exp,你调调看看行不
|
能力值:
( LV3,RANK:20 )
|
-
-
18 楼
|
能力值:
( LV3,RANK:30 )
|
-
-
19 楼
大神,控制了EIP然后怎么办啊?这里只能覆盖到EIP,没法在往后覆盖了,shellcode目测只能在内存里找到,如果把这个EIP写成jmp esp,跟着往后看,会有4字节的指令可以使用
我如果吧这个EIP写成shellcode在内存里的地址,可以顺利执行shellcode,已经试过了,关键这样做不具有通用性
|
能力值:
( LV3,RANK:20 )
|
-
-
20 楼
这得写一个rop了,一两句说不清,你在论坛里看看有没有rop类的帖子。
|
能力值:
( LV3,RANK:30 )
|
-
-
21 楼
大神,ROP是不是就是堆喷射?
如果不是能否告诉我ROP的全称,好让我我自己去搜索相关资料
|
能力值:
( LV11,RANK:180 )
|
-
-
22 楼
单单是只可以控制四字节的话你可以在控制字节的前边放上shellcode想办法跳过去,真不行就先前跳几个字节,再这几个字节里实现查找shellcode地址,找到跳进去
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
买本书或是找个系统的教材慢慢学吧,我看了failwest的帖子后就弄了本《0day》开始自己看了。
|
能力值:
( LV3,RANK:20 )
|
-
-
24 楼
呃~我感觉你先去exploit-db上找点别人的exploit看看吧,有的是比较简单的。
论坛中有个文章http://bbs.pediy.com/showthread.php?t=146321&highlight=rop
或许有点复杂。
至于堆喷和rop两个不同概念的东西。想理解堆喷看《0day...》Heap Spray那节。至于rop我理解的就是利用已控栈或堆中的数据以及已经从程序中搜集到的特殊指令比如(pop ... retn),来达到控制程序流程,最终达到关闭DEP或ASLR执行shellcode的目的。呃~有点晕。至于你,可以先理解rop的思想,然后自己找方法执行shellcode,可以先不用去关闭DEP或者ASLR。我知道的也就这些了。
|
|
|