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