memo is a x86_64 pwn challenge with provided libc. FULL RELRO and PIE is disabled. At start we should provide an username (and password). We can do the following operations:
There is also a two table (array) at .bss which keeps memo address and its size (<= 0x20).
After analysing each function it can be seen as memo has multiple issues:
new_message 0x400C52 if we enter size more than 0x20 we can overflow an heap allocation by malloc(0x20) with our size. and the allocated space won’t be placed in memos tableedit_last_message 0x400DA8 we can leak heap address after editing.view_memo 0x400E56 index is not checked against negative values although due to casting we can’t use this infoleak.change_password 0x400FF6 there is an off-by-one on entering password which overwrite LSB (Least significant byte) of first (index == 0) memo size.As you may noticed we have heap overflow (via using 4 or 1) but based on size limitation we should trick fastbins to own the challenge.
First of all we need a fastbin free chain. So allocating two chunk both of size 0x20 and then freeing the chunks in inverse order gives us a fastbin free chain of size 48 (0x30). We can then use 1 vulnerability to overflow the heap and corrupt heap so that free chain last pointer points to our arbitrary address. But remember we should provide our pointer in such a way that it bypasses the fastbin malloc corruption checks. To do so we should use an address with having a metadata (address-4) of size 48. For this case i choose memo table so if i can overwrite pointers in the table i have infoleak + write-what-where primitive. As i described earlier we can use password since it is located just behind the table. after overwriting the second pointer in the table and using view_memo i have libc leak and stack leak. Due to binary compiled with FULL RELRO protection, we can overwrite stack or creating a fake tls_dtors struct (but due to new protection against tls_dtors and issues in some cases i choose option 1). After leaking we can overwrite the second pointer in the table again with stack address and pwn the challenge.
You can see my exploit