저는 할당 된 간단한 난독 화 C 프로그램의 다음 ASM 코드를 가지고 있습니다.ELF 바이너리에서 asm 명령어를 수정하십시오.
0x00000000004006a0 <+147>: lea -0x20(%rbp),%rax
0x00000000004006a4 <+151>: mov %rdx,%rsi
0x00000000004006a7 <+154>: mov %rax,%rdi
0x00000000004006aa <+157>: callq 0x400713 <SECRET> <======
0x00000000004006af <+162>: movl $0x0,-0x24(%rbp)
0x00000000004006b6 <+169>: jmp 0x4006d8 <main+203>
0x00000000004006b8 <+171>: mov -0x24(%rbp),%eax
목표는 세그먼트 화 오류를 일으키는 기능 (프로그램 바이너리를 패치)을 찾아서 제거하는 것입니다. 어떤 기능이 segfault를 일으키는 지 알게되었지만 바이너리를 패치하는 방법을 모르겠습니다.
내 문제는 내가 늘 비밀 함수를 호출 할 수 있도록
0x00000000004006aa <+157>: callq 0x400713 <SECRET>
을 패치하는 방법이다.
gdb
을 사용하면 런타임시 단일 단계에서 프로그램 카운터를 수정하여 SECRET을 건너 뛰거나 건너 뛰기 위해 프로그램이 실행을 끝내고 원하는 출력을 제공합니다.
내가 원하는 것은 항상 디버거를 사용하지 않고 건너 뛸 수있는 실행 가능 바이너리 파일의 영구적으로 수정 된 복사본입니다.
거기에 건너 뛰거나 gdb없이 프로그램을 실행할 때 점프하는 방법이 있습니다 –
GDB에서 건너 뛰는 것은 과제를 해결하는 것으로 계산되지 않지만 예, gdb는 원하는 곳으로 점프 할 수 있습니다. gdb 매뉴얼을 확인하십시오. 디버깅 세션 중에 NOP로'call' 명령을 덮어 쓸 수도 있습니다. 이것이 바이너리 폭탄 실험실 과제와 같은 것이라면, 당신은 다른 입력을 주어야합니다. 그래서 실행은 결코 그 블록에 도달하지 못합니다. –
그래, 나는 프로그램 카운터와 함께 할 수 있지만, 바이너리를 편집하고 그 함수 호출을 제거하고 패치 된 파일을 저장하는 방법을 찾고있다. –