Очень сильно не хватает примера дизасемблерирования кода, и работы с дизасемблером.
Хоть с самым простым objdump.
Хоть с самым простым objdump.
Последнее редактирование:
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
cd /opt/protostar/bin/#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char **argv)
{
volatile int modified;
char buffer[64];
modified = 0;
gets(buffer);
if(modified != 0) {
printf("you have changed the 'modified' variable\n");
} else {
printf("Try again?\n");
}
}
python -c "print 'A' * 65" | ./stack0Статья читается полностью. Тезисы со ссылками на разделы появятся позже.
Очень сильно не хватает примера дизасемблерирования кода, и работы с дизасемблером.
Хоть с самым простым objdump.
Хороший вопрос. На мой взгляд это особенности работы компилятора или ОС. Нужно посмотреть выделение памяти в конкретной ОС. Мне тоже бы хотелось услышать ответ от автора.Скажите пожалуйста, почему хотя переменная modified и объявлена раньше буфера, на в памяти располагается после него? Или это особенность для volatile переменных?
Скажите пожалуйста, почему хотя переменная modified и объявлена раньше буфера, на в памяти располагается после него? Или это особенность для volatile переменных?
а можно подробней про установку образа.
кали - дебиан, а тут просто оракл 32 бит линукс указываешь. ну 1гб вполне сойдет под память. можно даже меньше. на скринах выше видно.я как раз его пошёл устанавливать как кали, а какой линукс, какая разрядность, скок всего выделять хз.))))
подскажите как решить проблему открытия файла stack0?кали - дебиан, а тут просто оракл 32 бит линукс указываешь. ну 1гб вполне сойдет под память. можно даже меньше. на скринах выше видно.
Не совсем понял вопроса. Можно запустить 2 VM кали и протостар. И дальше просто подключится по ssh к протостар. как запустить ?подскажите как решить проблему открытия файла stack0?
./stack0 или так /opt/protostar/bin/stack0Не совсем понял вопроса. Можно запустить 2 VM кали и протостар. И дальше просто подключится по ssh к протостар. как запустить ?./stack0или так/opt/protostar/bin/stack0
Ты его не посмотришь не как. Потому что написана программа на Си т.е. на скомпилированном языке программирования. Это не скриптовой язык программирования где код посмотреть можно. К примеру ты можешь...Я имел ввиду как открыть исходник, чтобы посмотреть код. Понимаю, что он предоставлен, но хотелось бы не просто запустить ./stack0 а именно открыть его, например для редактирования.
Спасибо, что так быстро реагируете и отвечаете на вопросы)
home\user\ или директорииtmp скомпилировать - собрать свой файл.Точно такой же с небольшими изменениями как ты хочешь ))gcc -fno-stack-protector -z execstack -m32 -g program.c -o program
Это актуально в 2019 году? компиляторы по умолчанию собирают с защитой от переполненения, форматирования строк и прочее, нет?кали - дебиан, а тут просто оракл 32 бит линукс указываешь. ну 1гб вполне сойдет под память. можно даже меньше. на скринах выше видно.
да, это задачки на которые учат ломать без защит (База эксплуатации). Потом можно порешать Fusion с защитами. Там уже mitigation ломать надо.Это актуально в 2019 году? компиляторы по умолчанию собирают с защитой от переполненения, форматирования строк и прочее, нет?
(gdb) disassemble main
Dump of assembler code for function main:
0x0000555555555145 <+0>: push rbp
0x0000555555555146 <+1>: mov rbp,rsp
0x0000555555555149 <+4>: sub rsp,0x60
0x000055555555514d <+8>: mov DWORD PTR [rbp-0x54],edi
0x0000555555555150 <+11>: mov QWORD PTR [rbp-0x60],rsi
=> 0x0000555555555154 <+15>: mov DWORD PTR [rbp-0x4],0x0
0x000055555555515b <+22>: lea rax,[rbp-0x50]
0x000055555555515f <+26>: mov rdi,rax
0x0000555555555162 <+29>: mov eax,0x0
0x0000555555555167 <+34>: call 0x555555555040 <gets@plt>
0x000055555555516c <+39>: mov eax,DWORD PTR [rbp-0x4]
0x000055555555516f <+42>: test eax,eax
0x0000555555555171 <+44>: je 0x555555555181 <main+60>
0x0000555555555173 <+46>: lea rdi,[rip+0xe8e] # 0x555555556008
0x000055555555517a <+53>: call 0x555555555030 <puts@plt>
0x000055555555517f <+58>: jmp 0x55555555518d <main+72>
0x0000555555555181 <+60>: lea rdi,[rip+0xea9] # 0x555555556031
0x0000555555555188 <+67>: call 0x555555555030 <puts@plt>
0x000055555555518d <+72>: mov eax,0x0
0x0000555555555192 <+77>: leave
0x0000555555555193 <+78>: ret
=> 0x0000555555555154 <+15>: mov DWORD PTR [rbp-0x4],0x0(gdb) x/i $rip=> 0x555555555154 <main+15>: mov DWORD PTR [rbp-0x4],0x0(gdb) nexti0x000055555555515f 13 gets(buffer);(gdb) x/2i $rip=> 0x555555555154 <main+15>: mov DWORD PTR [rbp-0x4],0x0 0x55555555515b <main+22>: lea rax,[rbp-0x50]rbp-0x50 в RAX - аккамулятор. я ещё не совсем понимаю что за аккамулятор, но щас посмотрим) 0x55555555515f <main+26>: mov rdi,rax(gdb) x/x $rbp-0x50
0x7fffffffe250: 0xffffe276
(gdb) x/i $rbp-0x50
0x7fffffffe250: jbe 0x7fffffffe234
(gdb) nexti
13 gets(buffer);
(gdb) x/i $rip
=> 0x55555555515b <main+22>: lea rax,[rbp-0x50]
(gdb)
(gdb) x/x $rax
0x555555555145 <main>: 0xe5894855
(gdb) x/x $rbp-0x50
0x7fffffffe250: 0xffffe276(gdb) nexti 0x000055555555515b <+22>: lea rax,[rbp-0x50]
=> 0x000055555555515f <+26>: mov rdi,rax
0x0000555555555162 <+29>: mov eax,0x0
(gdb) x/x $rbp-0x50
0x7fffffffe250: 0xffffe276
(gdb) x/x $rax
0x7fffffffe250: 0xffffe276
(gdb) x/x $eax
0xffffffffffffe250: Cannot access memory at address 0xffffffffffffe250
=> 0x0000555555555167 <+34>: call 0x555555555040 <gets@plt>
(gdb) x/i 0x555555555040
0x555555555040 <gets@plt>: jmp QWORD PTR [rip+0x2fda] # 0x555555558020 <gets@got.plt>nexti(gdb) x/4i $rip
=> 0x7ffff7e736f8 <_IO_gets+328>: call 0x7ffff7e7fc60 <__GI___uflow>
0x7ffff7e736fd <_IO_gets+333>: cmp eax,0xffffffff
0x7ffff7e73700 <_IO_gets+336>: jne 0x7ffff7e73641 <_IO_gets+145>
0x7ffff7e73706 <_IO_gets+342>: xor r8d,r8d
(gdb) nexti
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
39 in iogets.c
(gdb) x/4i $rip
=> 0x7ffff7e736fd <_IO_gets+333>: cmp eax,0xffffffff
0x7ffff7e73700 <_IO_gets+336>: jne 0x7ffff7e73641 <_IO_gets+145>
0x7ffff7e73706 <_IO_gets+342>: xor r8d,r8d
0x7ffff7e73709 <_IO_gets+345>: jmp 0x7ffff7e7364f <_IO_gets+159>
(gdb)
(gdb) x/x $eax
0x41: Cannot access memory at address 0x41(gdb) i r eax
eax 0x41 65(gdb) disassemble main
Dump of assembler code for function main:
0x0000555555555145 <+0>: push rbp
0x0000555555555146 <+1>: mov rbp,rsp
0x0000555555555149 <+4>: sub rsp,0x60
0x000055555555514d <+8>: mov DWORD PTR [rbp-0x54],edi
0x0000555555555150 <+11>: mov QWORD PTR [rbp-0x60],rsi
0x0000555555555154 <+15>: mov DWORD PTR [rbp-0x4],0x0
0x000055555555515b <+22>: lea rax,[rbp-0x50]
0x000055555555515f <+26>: mov rdi,rax
0x0000555555555162 <+29>: mov eax,0x0
0x0000555555555167 <+34>: call 0x555555555040 <gets@plt>
0x000055555555516c <+39>: mov eax,DWORD PTR [rbp-0x4]
=> 0x000055555555516f <+42>: test eax,eax
0x0000555555555171 <+44>: je 0x555555555181 <main+60>
0x0000555555555173 <+46>: lea rdi,[rip+0xe8e] # 0x555555556008
0x000055555555517a <+53>: call 0x555555555030 <puts@plt>
0x000055555555517f <+58>: jmp 0x55555555518d <main+72>
0x0000555555555181 <+60>: lea rdi,[rip+0xea9] # 0x555555556031
0x0000555555555188 <+67>: call 0x555555555030 <puts@plt>
0x000055555555518d <+72>: mov eax,0x0
0x0000555555555192 <+77>: leave
0x0000555555555193 <+78>: ret
End of assembler dump.
(gdb) x/x $rbp-0x4
0x7fffffffe1ec: 0x41414141
(gdb) x/4x $rbp-0x4
0x7fffffffe1ec: 0x41414141 0x41414141 0x41414141 0x41414141
(gdb) x/10x $rbp-0x4
0x7fffffffe1ec: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe1fc: 0x41414141 0x41414141 0x41414141 0x41414141
0x7fffffffe20c: 0x41414141 0x41414141
(gdb) x/x $eax
0x41414141: Cannot access memory at address 0x41414141
(gdb)
End of assembler dump.
(gdb) x/i 0x555555555181
0x555555555181 <main+60>: lea rdi,[rip+0xea9] # 0x555555556031
(gdb) x/i $rip+0xea9
0x55555555601c: and BYTE PTR [rdi],ah
(gdb) x/i $rdi
0x7fffffffe1a1: rex.B
(gdb) x/i 0x0000555555555171
0x555555555171 <main+44>: je 0x555555555181 <main+60>
(gdb) x/i 0x555555555181
0x555555555181 <main+60>: lea rdi,[rip+0xea9] # 0x555555556031
(gdb) x/4i 0x0000555555555171
0x555555555171 <main+44>: je 0x555555555181 <main+60>
=> 0x555555555173 <main+46>: lea rdi,[rip+0xe8e] # 0x555555556008
0x55555555517a <main+53>: call 0x555555555030 <puts@plt>
0x55555555517f <main+58>: jmp 0x55555555518d <main+72>
(gdb) x/4i 0x55555555518
0x55555555518: Cannot access memory at address 0x55555555518
(gdb) x/i 0x555555556008
0x555555556008: jns 0x555555556079
(gdb) x/4i 0x555555556008
0x555555556008: jns 0x555555556079
0x55555555600a: jne 0x55555555602c
0x55555555600c: push 0x20657661
0x555555556011: movsxd ebp,DWORD PTR [rax+0x61]
(gdb) nexti
0x000055555555517a 16 printf("you have changed the 'modified' variable\n");
(gdb) nexti
you have changed the 'modified' variable
0x000055555555517f 16 printf("you have changed the 'modified' variable\n");
(gdb) nexti
0x000055555555518d 18 printf("Try again?\n");
(gdb) nexti
20 }
(gdb) nexti
0x0000555555555193 20 }
(gdb) nexti
Program received signal SIGSEGV, Segmentation fault.
0x0000555555555193 in main (argc=2, argv=0x7fffffffe2d8) at stack0.c:20
20 }
(gdb) nexti
Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.
Комментарии
24