能力值:
( LV2,RANK:10 )
|
-
-
2 楼
用c做一个hello word 标准程序,用od打开,把所有编程的内存拷出来,一字节一字节定义。补充下,还要用到编译头指定,入口位置。好久没做这块相关了,期待楼主完整程序
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
你说的这个我 - - 只会OD打开 调试个代码找个key什么的。。 你说的貌似不会啊
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
linux 下的:
section .text
global main
main:
mov eax,4 ; 4号调用
mov ebx,1 ; ebx送1表示输出
mov ecx,msge ; 字符串的首地址送入ecx
mov edx,14 ; 字符串的长度送入edx
int 80h ; 输出字串
mov eax,1 ; 1号调用
int 80h ; 结束
msge:
db “Hello World!”,0ah,0dh
用 nasm 编译出来得到可执行文件, 可执行文件 main 函数的内容(十六进制) 就是答案
直接
char[?] main {0x90, 0x90, 0x90, 0x90, ...} 更直观吧
windows 下也差不多 只是调用的中断号不是 int 80h 而已
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
感觉第一句话就注定了这是个不可能的事情(总得有个外壳去执行你那些char吧,不定义函数而使用标号来为link指定入口,貌似编译是通不过的),所以当做楼主表达的不是这个意思哈。
想想楼主应该就是想用直接定义0x0x0x........这样子的东西来输出(想想是蛮帅气的)。char的话(不考虑外壳的事情了)会被定义到栈上,貌似听说现在不是不允许栈执行么,我在od里跳到栈上执行下,貌似也没什么问题,可能是服务器的吧,最好还是用_emit来写吧。
最关键的是到底写些什么东西了,其中最关键的就是硬编码怎么确定函数地址了。我这里还是用printf来做。这个函数在msvcrt.dll中。用GetProcAddress来获取地址。至于GetProcAddress的地址,参看shellcode怎么写吧。关于dll,空的控制台默认没有链接msvcrt.dll,可以自己链接的时候加进去。当然也可以用LoadLibrary,和GetProcAddress同在kernel32里。
至于楼主第一处提到的写屏,我理解成了windows里的API,可以跟下printf最后到哪去了,printf繁杂的话可以换成其他输出的库函数。
看到第二处写屏,好吧,原来这个意思。0xb8000。。。现在windows是不会让你写的吧。貌似以前还是行得通。你提到的控制数据的话,那个就在你硬编码的代码里加上查找Helloworld字符串的代码,简单点Helloworld直接放在你写的代码一起。
最后整的感觉加上九楼的代码,好像在dos里面玩样的。
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
有一大神直接动态定位MBA弹窗了helloworld 他那可以- - char main到了200+ 我这里执行错误- -
|
能力值:
( LV2,RANK:10 )
|
-
-
14 楼
MBA?是啥。。MessageBoxA。。。如果是那不也一样的么?定位msvcrt.dll里的printf和定位uer32.dll中的MessageBoxA有多大区别呢
|
能力值:
( LV3,RANK:30 )
|
-
-
16 楼
**而已。。。。谁不会
char aFuncByte[]={0xcc};
__asm call aFuncByte
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
程序启动后会跳转到符号main处执行
通常情况下符号main指向的是main函数
在这个程序中符号main指向的是变量main
因此main及之后的数据会被当作汇编代码来执行(未开启DEP的情况下)
编译一个hello world程序,调整一下对应的汇编代码得到:
.data:00408000 55 push ebp
.data:00408001 8B EC mov ebp, esp
.data:00408003 51 push ecx
.data:00408004 6A 00 push 0
.data:00408006 8D 45 FC lea eax, [ebp+var_4]
.data:00408009 50 push eax
.data:0040800A 6A 0D push 0Dh
.data:0040800C 68 26 80 40 00 push offset aHelloWorld ; "Hello world!\n"
.data:00408011 6A F5 push 0FFFFFFF5h
.data:00408013 FF 15 34 80 40 00 call dword_408034
.data:00408019 50 push eax
.data:0040801A FF 15 38 80 40 00 call dword_408038
.data:00408020 33 C0 xor eax, eax
.data:00408022 8B E5 mov esp, ebp
.data:00408024 5D pop ebp
.data:00408025 C3 retn
.data:00408026 48 65 6C 6C 6F 20 77 6F 'Hello world!',0Ah,0
.data:00408034 C9 2F 81 7C 7C812FC9h
.data:00408038 45 CC 81 7C 7C81CC45h
对应的程序
char main[] = {
0x55, 0x8B, 0xEC, 0x51, 0x6A, 0x00, 0x8D, 0x45,
0xFC, 0x50, 0x6A, 0x0D, 0x68, 0x26, 0x80, 0x40,
0x00, 0x6A, 0xF5, 0xFF, 0x15, 0x34, 0x80, 0x40,
0x00, 0x50, 0xFF, 0x15, 0x38, 0x80, 0x40, 0x00,
0x33, 0xC0, 0x8B, 0xE5, 0x5D, 0xC3, 0x48, 0x65,
0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C,
0x64, 0x21, 0x0A, 0x00, 0xC9, 0x2F, 0x81, 0x7C,
0x45, 0xCC, 0x81, 0x7C
};
注意,这里硬编码了两个函数地址,适用于WinXP SP3
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
我就是SP3 - - 结果报错
而且要求是 char main=,main1...
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
c语言不用任何括号
你的main 函数不用括号? () {} [] 这些符号 都不用。 你程序能跑过?
如果是改写二进制文件。 那不如直接ctrl +c ctrl+v 行了。跟C语言有屁关系 。
|
能力值:
( LV2,RANK:10 )
|
-
-
23 楼
[QUOTE=whnet;1311245]你的main 函数不用括号? () {} [] 这些符号 都不用。 你程序能跑过?
如果是改写二进制文件。 那不如直接ctrl +c ctrl+v 行了。跟C语言有屁关系 。[/QUOTE]
就是不用括号..而且就是vc编译通过的 有人已经做出来了- 只是我不知道 他说就是我说的那种char main的形式
|
能力值:
(RANK:10 )
|
-
-
24 楼
这题主要看对编译的认识, 甚至对编译器的认识(选项).
18楼的代码贴的是对的, 差两点.
#pragma comment(linker, "/section:.data,rwe") #pragma comment(linker, "/entry:main")
char main[] = { 0x55, 0x8B, 0xEC, 0x51, 0x6A, 0x00, 0x8D, 0x45, 0xFC, 0x50, 0x6A, 0x0D, 0x68, 0x26, 0x80, 0x40, 0x00, 0x6A, 0xF5, 0xFF, 0x15, 0x34, 0x80, 0x40, 0x00, 0x50, 0xFF, 0x15, 0x38, 0x80, 0x40, 0x00, 0x33, 0xC0, 0x8B, 0xE5, 0x5D, 0xC3, 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x77, 0x6F, 0x72, 0x6C, 0x64, 0x21, 0x0A, 0x00, 0xC9, 0x2F, 0x81, 0x7C, 0x45, 0xCC, 0x81, 0x7C };
要是你觉得还不对, 就可以把编译选项写进项目linker command line中. 这样程序只剩一个char定义了, 看起来更"碉堡"一点.
|