Pwnable

[구름EDU 스터디] 다른 변수 덮어씌우기

hy30nq 2024. 10. 3. 17:59
728x90
#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");
  }
}

강의가 짤려서 혼자 진행했다 

 

해당 문제는 buffer를 덮어서 modified를 0을 넣으면 된다.

 

하지만 강의가 짤려서 진행을 할 수 없기에 해당 문제를 풀기 위한 어셈블리어를 정리했다.

 

어셈블리어 
함수 - call
  • 인자가 있는 경우 함수 호출 규약에 따라 인자를 레지스터 또는 스택에 전달 (32비트 → 스택, 64비트 → 레지스터)
  • operand1로 이동하기 전에 복귀 주스를 스택에 넣고 이동
  •  
    call 0x401106
    
    push 0x401107 # 다음 주소 스택에 넣고
    jmp 0x401106
 
복귀 주소 (return address)
  • 함수의 호출이 끝난 이후 다시 돌아와야 하기 때문에 스택에 저장하는 주소
 
  • leave 
  • ret
 
  • 함수의 프롤로그
  • 함수의 에필로그
 

시스템 콜

  • 커널이 제공하는 서비스에 접근하기 위한 인터페이스
  • 프로세스, 파일, 장치, 정보, 통신, 보안 등의 기능은 커널에서 처리해서 결과를 반환해줌
  • 각 시스템 콜에는 번호가 할당
  • 자주 접하는 시스템 콜 (리눅스)
 
 

시스템 콜 - x86 리눅스

  • int 0x80
  • x86에서 시스템 콜을 호출하는 명령
  • 시스템 콜을 호출하기 이전에 시스템 콜 번호와 인자들을 세팅해야 함
  • x86에서 eax에 시스템 콜 번호를 넣고 인자는 ebx, ecx, edx, esi, edi, ebp에 넣는다.
 

시스템 콜 - x64 리눅스

  • syscall
  • x86_64에서 시스템 콜을 호출하는 명령
  • 시스템 콜을 호출하기 이전에 시스템 콜 번호와 인자들을 세팅해야 함
  • x86_64에서는 rax에 시스템 콜 번호를 넣고 인자는 rdi, rsi, rdx, rcx, r8, r9에 넣는다.
 
시스템 콜 - 윈도우
rcx → rdx → r8 → r9
 
728x90