
你想有多 pwn
文章平均质量分 85
。。。
她送的苦茶子
不知名 ctfer
展开
-
格式化字符串的简单学习
通俗来说,格式化字符串函数就是将计算机内存中表示的数据转化为我们人类可读的字符串格式。这样就能泄露栈上第 25 个字节处的值 也就是这道题的 canary。这个地方有异或操作,而且之后就跳转回 main 函数,所以 [rbp-0x8] 应该就是栈中存放 canary 的地址。对于 2,3 来说倒还无妨,但是对于对于 1 来说,如果提供了一个不可访问地址,比如 0,那么程序就会因此而崩溃。在进入 printf 函数的之前 (即还没有调用 printf),栈上的布局由高地址到低地址依次如下。原创 2024-02-13 12:08:58 · 1921 阅读 · 0 评论 -
ret2csu 从 0 到 0.1
在 64 位程序中,函数的前 6 个参数是通过寄存器传递的,但是大多数时候,我们很难找到每一个寄存器对应的 gadgets,比如说我们想构造 64 位程序 write 函数的三个参数,那就需要操作 rdi,rsi,rdx ,三个寄存器,如果找不全关于这三个寄存器的 gadget 呢,比如下面用的上的就只有 pop rdi;可以看到 gadget1 对 rdx,rsi,edi 赋值 r14,r13,r12,这不刚好就是我们想要的参数吗,而且 gadget2 又可以操控 r14,r13,r12 的值。原创 2024-01-27 18:57:02 · 419 阅读 · 0 评论 -
初探 ret2libc
可执行二进制程序调用函数A时,会先找到函数A对应的PLT表,PLT表中第一行指令则是找到函数A对应的GOT表。此时由于是程序第一次调用A,GOT表还未更新,会先去公共PLT进行一番操作查找函数A的位置,找到A的位置后再更新A的GOT表,并调用函数A。简单来说就是程序第一次调用某个函数 got 表里放的还不是 这个函数的真实地址,但是第二次调用 got 表放的是 这个函数的真实地址了。我们可以发现 puts 函数运行过了,所以就用 puts 了,分别拿 puts 的 plt 表和 got 表的对应地址。原创 2024-01-23 17:16:18 · 1069 阅读 · 0 评论 -
浅谈 ret2text
而此时栈顶指针指向 ‘/bin/sh’ 的地址,于是 ‘/bin/sh’ 被放入 rdi 中,然后执行 ret,此时后门函数地址顶上来了,于是就 ret 到了 func 的地址 (这就是为什么找的是pop rdi;我瞎猜的,不然不好解释)而拿去参数也是同过 EBP 偏移量来实现的,本来有返回地址时通过 [EBP+8] 来拿参数一,但是因为没有返回地址 此时 EBP 和 参数相邻相差 4 个字节,所以 EBP + 8 就不是参数一的地址了。前六个参数依次存放于rdi,rsi,rdx,rcx,r8,r9中。原创 2024-01-21 15:57:14 · 1504 阅读 · 0 评论 -
gdb 简单使用
可以发现确实写进去了 有三个 616161,那如果我们写多点岂不是就能使之溢出覆盖 0x0x7fffffffe030 处的值了?然后继续执行果然进入了函数里拿到 shell 了,本地验证了一下只要让 al = 0x61 就是能拿到 shell 的。eax = byte ptr [rbp -0x10] ,所以我们看一下 rbp -0x10 地址处有些什么内容。如果 al = 0x61 就会跳过 jne 执行后面的代码。我们先执行到这一步,然后查看 rbp -0x10 地址处前 20个字节的数据。原创 2024-01-18 15:16:06 · 350 阅读 · 0 评论 -
初识 shellcode
通常是指软件漏洞利用过程中使用一小段机器代码。原创 2024-01-17 22:18:30 · 1873 阅读 · 0 评论