首页
社区
课程
招聘
c语言不用括号输出hello world的问题
发表于: 2014-8-19 00:31 16441

c语言不用括号输出hello world的问题

2014-8-19 00:31
16441
c语言不用任何括号输出hello world!
char main=0x..,main1=0x..,....;

这样编译后运行正确,请问答案和原理?

额 我说答案是类似这样的 我没答案啊

char main=0x90,main1=0x90,main2=0x90.....;
我也不知道到main多少结束 这个是0x90全NOP填充啊。其实答案就是改了0x90这些进制数就可以了。。
我觉得思路是0x90这些东西替代了汇编指令,但是不知道怎么做。。

我觉得这是要写屏实现的,但是不知道c语言的main入口怎么就直接到了写屏那里去了!望高手解析!

main入口点不知道是不是固定的,我感觉这道题和写屏有点关系,通过char main后面的数据换指令,直接写到0b800h上去输出,mov

这样编译是没问题的,就是怎么控制数据代码的问题,。

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (48)
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用c做一个hello word 标准程序,用od打开,把所有编程的内存拷出来,一字节一字节定义。补充下,还要用到编译头指定,入口位置。好久没做这块相关了,期待楼主完整程序
2014-8-19 01:33
0
雪    币: 6
活跃值: (60)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
3
你会了吗?会了就写出来啊...
2014-8-19 07:43
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你说的这个我 - - 只会OD打开 调试个代码找个key什么的。。 你说的貌似不会啊
2014-8-20 16:16
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我不会啊
2014-8-20 16:18
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
现在是不知道数据怎么写- - 另外。 答案用了char30+就结束了..
2014-8-20 16:21
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
期待答案中
2014-8-20 16:40
0
雪    币: 23
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这活做起来,累死人,按机器码写helloword网上有现成的程序。
2014-8-20 17:48
0
雪    币: 101
活跃值: (29)
能力值: ( 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 而已
2014-8-20 18:32
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
不懂,期待
2014-8-20 18:54
0
雪    币: 48
活跃值: (10)
能力值: ( 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里面玩样的。
2014-8-20 20:04
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
有一大神直接动态定位MBA弹窗了helloworld 他那可以- - char main到了200+ 我这里执行错误- -
2014-8-21 13:01
0
雪    币: 34
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
感觉是高大的样子。
2014-8-21 14:01
0
雪    币: 48
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
MBA?是啥。。MessageBoxA。。。如果是那不也一样的么?定位msvcrt.dll里的printf和定位uer32.dll中的MessageBoxA有多大区别呢
2014-8-21 16:13
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
那个人不会写屏 -我也不造什么情况..
2014-8-22 13:06
0
雪    币: 65
活跃值: (112)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
**而已。。。。谁不会

char aFuncByte[]={0xcc};

__asm call aFuncByte
2014-8-22 13:30
0
雪    币: 240
活跃值: (190)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
17
这个太简单了,方法太多了,不算题目
2014-8-22 13:33
0
雪    币: 6
活跃值: (12)
能力值: ( 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
2014-8-22 21:21
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
我就是SP3 - - 结果报错
而且要求是 char main=,main1...
2014-8-23 13:12
0
雪    币: 6
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
报的什么错?

这样写方便一点,按你的格式拆开写就是了
2014-8-23 13:23
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
0X00000000引用的0X00000000不能为read
2014-8-23 14:40
0
雪    币: 185
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
c语言不用任何括号


你的main 函数不用括号?  () {} []  这些符号 都不用。 你程序能跑过?  

如果是改写二进制文件。 那不如直接ctrl +c  ctrl+v 行了。跟C语言有屁关系 。
2014-8-23 14:43
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
[QUOTE=whnet;1311245]你的main 函数不用括号?  () {} []  这些符号 都不用。 你程序能跑过?  

如果是改写二进制文件。 那不如直接ctrl +c  ctrl+v 行了。跟C语言有屁关系 。[/QUOTE]

就是不用括号..而且就是vc编译通过的 有人已经做出来了- 只是我不知道 他说就是我说的那种char main的形式
2014-8-23 15:00
0
雪    币: 2
能力值: (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定义了, 看起来更"碉堡"一点.
2014-8-23 15:06
0
雪    币: 2
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
但是我这里运行给了一个错误.就是刚才那个
2014-8-23 15:25
0
游客
登录 | 注册 方可回帖
返回
//