Я переворачиваю скомпилированную программу (написанную на C), и она открывает файл (который у меня нет прав на чтение), например:
fopen("/home/user00/.pass", 'r')
затем проверяет возврат:
...
0x4008a8 <main+148>: call 0x400700 <fopen@plt>
0x4008ad <main+153>: mov QWORD PTR [rbp-0x8],rax
=> 0x4008b1 <main+157>: cmp QWORD PTR [rbp-0x8],0x0
0x4008b6 <main+162>: jne 0x4008e6 <main+210>
0x4008dc <main+200>: mov edi,0x1
0x4008e1 <main+205>: call 0x400710 <exit@plt>
...
Так что, если файл не открывается, программа завершается.
Я, очевидно, могу обмануть это, установив $rax=1
, но тогда программа попытается прочитать файл и получит ошибку.
Поэтому я подумал, что могу:
gdb call fopen("/a/file/I/can/read", 'r')
И продолжаю мою обратную работу, но, к сожалению, программа получает другой segfault, когда я выполняю эту команду.
Так что мне интересно, возможно ли каким-то образом (распределением или чем-то еще) позвонить fopen
?
Я уже безуспешно искал ответы в Интернете.
Эта программа является частью задачи моей школы по безопасности ISO CTF.
Спасибо!