
pwn
文章平均质量分 81
My6n
我们会毁灭于我们所热爱的东西
展开
-
CTFshow-PWN-栈溢出(pwn45)
我们一般常用的方法是采用 got 表泄露,即输出某个函数对应的 got 表项的内容,由于 libc 的延迟绑定机制,我们需要泄漏已经执行过的函数的地址。system 函数属于libc,而 libc.so 动态链接库中的函数之间相对偏移是固定的,即使程序有 ASLR 保护,也只是针对于地址中间位进行随机,最低的 12 位并不会发生改变。PLT用于间接调用共享库中的函数。这些方法和函数通常用于在漏洞利用过程中查找特定函数的地址(例如 system 函数)或特定字符串的地址(例如 /bin/sh 字符串)。原创 2024-05-20 12:49:33 · 1187 阅读 · 1 评论 -
CTFshow-PWN-栈溢出(pwn44)
在这个 payload 中,由于 rdi 寄存器已经被设置为 buf2_addr 的值,我们在调用 gets() 函数之后并不需要返回到原来的函数中,而在调用 system() 函数之前,我们已经将 buf2_addr 的值再次放入栈中。因此,在这里两个 p64(ret_addr) 可以被省略,因为在调用 gets() 函数和 system() 函数之间并不需要进行额外的栈调整。BSS 段是用来存储未初始化的全局变量和静态变量的,操作系统在程序加载时会为这些变量分配内存并将其初始化为零或空指针。原创 2024-04-25 00:09:56 · 907 阅读 · 0 评论 -
CTFshow-PWN-栈溢出(pwn43)
这是 gets() 函数的地址,我们将覆盖函数返回地址为 gets() 函数的地址,这样在程序返回时会跳转到 gets() 函数执行,我们就可以利用 gets() 函数从输入中获取数据。:这是 system() 函数的地址,我们将覆盖 gets() 函数的返回地址为 system() 函数的地址,这样在 gets() 函数执行完毕后,程序会继续执行 system() 函数。:这部分是填充数据,长度为 offset,目的是为了覆盖函数的返回地址,并确保我们能够控制程序的执行流程。原创 2024-04-24 22:38:55 · 1593 阅读 · 0 评论 -
CTFshow-PWN-栈溢出(pwn41-pwn42)
32位的 system();但是没"/bin/sh" ,好像有其他的可以替代检查一下:32 位程序ida32 分析:跟进 ctfshow 函数:存在栈溢出buf 到栈底距离:0x12存在 system 函数:system 函数地址:0x80483D0但是并未找到 /bin/sh找到了一个 useful 函数:该函数调用了 printf 函数,并传入字符串 "sh" 作为参数,然后将 printf 函数的返回值作为 useful 函数的返回值。原创 2024-04-24 17:31:44 · 804 阅读 · 3 评论 -
CTFshow-PWN-栈溢出(pwn40)
在64位的Linux系统中,参数传递是通过寄存器来完成的,而 system 函数的第一个参数(即需要执行的命令字符串)是通过 rdi 寄存器传递的,所以,我们首先需要将 /bin/sh 字符串的地址放入 rdi 寄存器中,然后才能调用system函数,这就是为什么我们需要知道 pop rdi;--only "pop|ret": 指定了只查找包含"pop"和"ret"指令序列的代码片段,这些指令通常用于弹出寄存器中的值,并将控制流返回到调用函数的地址处,是ROP攻击中常用的gadgets。原创 2024-04-24 12:03:15 · 1221 阅读 · 0 评论 -
CTFshow-PWN-栈溢出(pwn39)
p32(bin_sh):这部分是 /bin/sh 字符串的地址,作为 system 函数的第一个参数,/bin/sh 是一个用于启动 shell 的路径,在利用缓冲区溢出漏洞时,我们可以使用这个参数来告诉 system 函数要执行的命令。p32(0):这部分是 system 函数的第二个参数,在大多数情况下,system 函数的第二个参数应该是一个指向空值的指针,表示没有额外的参数,这里使用了0,表示一个空指针。根据题目描述:32位的 system();/bin/sh 字符串的地址: 0x8048750。原创 2024-04-24 09:05:55 · 1839 阅读 · 3 评论 -
CTFshow-PWN-栈溢出(pwn37-pwn38)
当我们在堆栈中进行堆栈的操作的时候,一定要保证在 ret 这条指令之前,esp 指向的是我们压入栈中的地址,函数执行到 ret 执行之前,堆栈栈顶的地址 一定要是 call 指令的下一个地址。对于这种有后门函数的简单栈溢出我们就不作过多分析,这种类型题是有固定套路的,我们这里就直接用模版 exp 打通。因此我们还需要找一个地址: lev 的地址或者该函数结束的地址(即 retn 的地址)(注意这里的 /bin/sh 直接双击跟进的地址并不是后门函数的地址)跟进 ctfshow 函数,也是典型的栈溢出。原创 2024-04-23 23:47:49 · 1570 阅读 · 0 评论 -
CTFshow-PWN-栈溢出(pwn36)
每次调用 puts 函数时,它都会再次进入函数体内,然后又调用 puts 函数,这样就形成了无限递归调用。声明了一个长度为 36 字节的字符数组 s,调用 gets 函数,并将 s 数组作为参数传递给它,然后将 gets 函数的返回值作为 ctfshow 函数的返回值。这个特定的 puts 函数定义中,函数体内部再次调用了 puts 函数,并且传递了相同的参数 s。disass 是 GDB 的指令,这里是反汇编名为 get_flag 的函数。这里 s 数组存在栈溢出的可能,具体看后面的分析,原创 2024-04-23 12:35:49 · 1139 阅读 · 2 评论 -
CTFshow-PWN-栈溢出(pwn35)
从指定的输入流 stream 中读取最多 63 个字符(因为最后一个位置留给了空字符 '\0')到名为 flag 的字符数组中;当程序执行中发生段错误时,会触发 SIGSEGV 信号,此时程序会自动调用 sigsegv_handler 函数进行处理。使用 strcpy 函数将 src 指向的字符串拷贝到 dest 中,返回指向 dest 的指针,即拷贝后的字符串的起始地址。ctfshow 的函数接受一个指向字符数组的指针 char *src 作为参数;没有输出 flag,因为不存在溢出,程序没有出错。原创 2024-04-22 23:48:00 · 604 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn32-pwn34)
禁用 Fortify 功能。不会进行任何额外的安全检查。可能导致潜在的安全漏洞。FORTIFY_SOURCE=0 是 Linux 系统中的一个环境变量,用于禁用 Fortify Source 功能,Fortify Source 是 GCC 编译器提供的一种安全增强功能,当 FORTIFY_SOURCE 设置为 0 时,编译器将禁用这一安全功能,不再对代码进行缓冲区溢出检查。检查一下64 位程序,未开 canary 保护,其他保护全开ida 查看 main 函数代码解释:argc。原创 2024-04-21 16:40:37 · 937 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn26-pwn31)
ASLR(Address Space Layout Randomization)是一种操作系统级别的安全功能,它通过在每次程序运行时随机化内存地址的布局,使得攻击者更难以利用内存地址的固定位置进行攻击,ASLR 随机化的内容包括栈、堆、共享库、堆栈和内存映射等。拖进 ida 同样会发现这道题还是存在溢出,并且已经知道 main 函数地址,需要通过计算偏移得到程序本身加载的地址,但是这些对我这种新手来说真的太不友好了,我的建议是先从后面简单的栈溢出开始来,后面再返回来看这些不懂的。原创 2024-04-20 19:23:53 · 1050 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn24-pwn25)
你可以使用pwntools的shellcraft模块来进行攻击32位程序,只开了部分 RELRO 保护可以看到多出了一个 RWX: Has RWX segments这意味着二进制文件中存在至少一个段(通常是代码段),它同时拥有读、写、执行权限反编译尝试跟进 ctfshow 函数但是不行这个是它的汇编代码:使用 python 运行:拿到 shell执行命令拿到 flag:ctfshow{f615f3c6-b99a-4590-ac95-1f7baf5b974b}原创 2024-04-20 16:43:39 · 1047 阅读 · 1 评论 -
CTFshow-PWN-前置基础(pwn23)
函数 ctfshow 的功能是将传入的字符串 src 复制到一个本地字符数组 dest 中,并返回 dest 的地址,dest 数组的大小为58,但是strcpy函数不会检查目标数组的大小是否足够,因此可能会导致缓冲区溢出。如果命令行参数的数量大于 1,则调用 ctfshow 函数,传递第一个命令行参数作为参数;的值将是 3,因为有三个参数,分别是程序名称、"arg1" 和 "arg2"。表示程序执行时传递的第一个命令行参数,也就是程序名称之后的参数,表示参数的数量,包括程序名称在内。原创 2024-04-20 11:18:00 · 677 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn21-pwn22)
将 .init_array、.fini_array、.dynamic 和 .got 这些节(Sections)合并到一起,以形成一个可加载的程序段,这个段的权限标志为只读,表示这些节在程序加载后将被设置为只读。可以看到新增了 GNU_RELRO 信息的程序头,并且它的权限为只读(R),这意味着在程序加载后,.got 段和 .got.plt 段之间的空间将被设置为只读。提交ctfshow{【.got表与.got.plt是否可写(可写为1,不可写为0)】,【.got的地址】,【.got.plt的地址】}原创 2024-04-18 23:37:07 · 619 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn20)
RELRO(RELocation Read-Only)保护是一种针对二进制可执行文件的安全性措施,用于防止针对程序中全局偏移表(GOT)和程序加载时动态链接器(LD)的攻击,确保全局偏移表(GOT)和过程链接表(PLT)在程序加载后被设为只读,从而使得攻击者无法修改这些表以执行恶意代码注入或覆盖函数指针等攻击。提交ctfshow{【.got表与.got.plt是否可写(可写为1,不可写为0)】,【.got的地址】,【.got.plt的地址】.got 不可写而 .got.plt 可写。原创 2024-04-18 22:05:24 · 1197 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn18-pwn19)
关于这两道题的总结:1、>: 将命令的输出重定向到指定文件,如果文件不存在则创建,如果存在则覆盖文件内容;>>: 将命令的输出追加到指定文件的末尾,如果文件不存在则创建。2、fork() 函数的作用是创建一个新的进程,这个新进程是调用进程的副本。具体来说,fork() 函数在父进程中返回子进程的进程 ID,而在子进程中返回 0。通过这种方式,父子进程可以根据返回值的不同来执行不同的代码逻辑,实现并发执行或者多进程模型。原创 2024-04-17 23:41:23 · 1291 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn17)
注:0xAuLL 中的 uLL 表示这是一个无符号长长整型(unsigned long long)的常量,sleep(0x1BF52u)中的u表示无符号整型(unsigned)。在 UNIX 系统中,0 表示标准输入(STDIN),1 表示标准输出(STDOUT),2 表示标准错误(STDERR)。cat /ctf* 或者 /;db 是汇编语言中的伪指令(pseudo-instruction),用于声明字节(byte)类型的数据。dest 是一个标签(label),它是程序中一个位置的名称或者符号。原创 2024-04-17 17:03:38 · 1522 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn13-pwn16)
如何使用GCC?编译运行后即可获得flag下载附件,是一个 .c 文件定义了一个字符数组 flag[],其中包含一系列 ASCII 码值,最后以NULL字符(\0)结尾,表示字符串的结束,使用 printf() 函数,其中的 %s 是格式化字符串中的一个格式说明符,用于指示 printf() 函数要打印的内容是一个字符串,将字符数组以字符串的形式输出。编译好后我们直接使用 ./ 执行得到 flag:ctfshow{hOw_t0_us3_GCC?原创 2024-04-16 19:19:24 · 1348 阅读 · 0 评论 -
CTFshow-PWN-前置基础(pwn10-pwn12)
寄存器相对寻址方式结束后eax寄存器的值为?在 ida 中找到对应汇编代码:双击跟进 dword_80490E8 ,得到这里 msg 的地址是:0x80490E8将该地址赋给寄存器 ecx接着使用 add 指令对 ecx 加 40x80490E8 对应十进制为 134516968因此 add 执行后,ecx 中值变为:134516972转为十六进制为:0x80490ec接下来是将 ecx 所指向的地址的值赋给 eaxecx 指向地址为 0x80490ec。原创 2024-04-16 17:20:16 · 579 阅读 · 2 评论 -
CTFshow-PWN-前置基础(pwn6-pwn9)
立即寻址方式结束后eax寄存器的值为?截取关键代码mov 用于赋值,将右边立即数加载到左边的寄存器 eax 中;add 将寄存器 eax 中的值与立即数 114504 相加,并将结果存储回寄存器eax中;sub 从寄存器eax中的值中减去1,并将结果存储回寄存器eax中。原创 2024-04-15 23:47:01 · 711 阅读 · 1 评论 -
CTFshow-PWN-前置基础-pwn5
x86 处理器是小端序,即将一个多位数的低位放在较小的地址处,高位放在较大的地址处,小端序与人类的阅读习惯相反,但更符合计算机读取内存的方式,因为CPU读取内存中的数据时,是从低地址向高地址方向进行读取的,因此这里应该是 Welc。使用 nasm 命令对该汇编文件进行编译,指定输出格式为 ELF 格式,这种格式是一种在 UNIX 系统中广泛使用的可执行文件格式,它包含了程序的二进制代码、数据、符号表等信息。: 这是要链接的输入文件,是由汇编器生成的对象文件,它包含了汇编代码的已编译二进制表示。原创 2024-04-15 21:10:33 · 1234 阅读 · 0 评论 -
CTFshow-PWN-Test_your_nc(pwn0-pwn4)
连上,等它程序执行完你可以直接来到 shell 界面执行命令,获取 flag。原创 2024-04-15 18:47:29 · 1399 阅读 · 0 评论 -
基于xinetd部署pwn题(百分百搭成并且可以nc靶场地址)
下面讲的东西请大家务必耐心看完,先不要着急去搭建,如果只是为了搭建我直接就给你们放几个命令就行了,还是真心希望各位能顺利部署pwn题目。关于更换flag和pwn程序我们有两种方法;原创 2023-07-17 14:22:35 · 4214 阅读 · 17 评论 -
pwn06(关于64位程序堆栈平衡的处理)
堆栈平衡:当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址,函数执行到ret执行之前,堆栈栈顶的地址 一定要是call指令的下一个地址。原创 2023-07-07 12:49:57 · 1727 阅读 · 1 评论 -
pwn05(应对简单栈溢出的常规套路)
一、常规检查(nc、file、checksec)二、IDA反编译,只找两个东西即可1、寻找造成栈溢出的函数的地址到ebp的距离2、寻找我们所要利用的函数的地址(即我们希望程序最后返回到哪里)三、编写并运行exp脚本原创 2023-07-07 11:05:42 · 660 阅读 · 0 评论 -
初识栈溢出 pwn02
栈溢出、ida反编译、checksec、pwn02、exp脚本编写原创 2023-07-06 18:46:30 · 379 阅读 · 2 评论 -
初识 pwn(get_shell、hello_pwn)
初识pwn、get_shell、hello_pwn、软件保护机制、exp脚本编写、pwntools、NX、IDA pro原创 2023-04-01 23:05:44 · 1377 阅读 · 0 评论