据说是美国最“怪”C程序大赛的获奖程序

int main()

{

printf(&unix["/021%six/012/0"], (unix)["have"] + "fun" - 0x60);

}

gcc -S编译成汇编代码如下:

        .file   "test.c"
        .section        .rodata
.LC0:
        .string "fun"
.LC1:
        .string "/021%six/n"
        .string ""
        .text
.globl main
        .type   main,@function
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        subl    %eax, %esp
        subl    $8, %esp
        movl    $.LC0, %eax
        subl    $96, %eax
        addl    $97, %eax
        pushl   %eax
        pushl   $.LC1+1
        call    printf
        addl    $16, %esp
        leave
        ret
.Lfe1:
        .size   main,.Lfe1-main
        .section        .note.GNU-stack,"",@progbits
        .ident  "GCC: (GNU) 3.2.3 20030502 (Red Hat Linux 3.2.3-47)"


关键点:

1.linux下有宏定义 MACRO unix = 1
2.对数组的理解1["have"] <==> "have"[1]
  &1["abcd"]就是'b'的地址
3.C语言对转义的规定 /ddd 为1~3位八进制数所代表的字符 /xhh表示1~2位16进制数所代表的字符,故/021表示ASCII值为十进制17的字符;/012表示换行符;/0就是字符串结束符

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值