no image
gdb로 main 함수 찾기
이 글은 워게임을 풀 때 파일이 stripped 되어 있어 main 함수 심볼을 disass 할 수 없을 때 main 주소를 찾는 방법이다. 보호기법도 다 걸려있는 문제일 땐 유용하게 쓰일 거 같아 글로 남겨본다..예제 문제예제 문제는 pwnable.xyz의 welcome 문제이다. 이 문제의 보호기법과 파일 정보는 이러하다.64bit elf 파일로 동적 라이브러리를 사용하고, stripped 되어있는 파일이라 함수의 심볼 정보가 없다.stripped란?보통 ELF 실행파일 형식은 stripped 이거나 not stripped 일 수 있다. strip은 실행파일에서 실행에 필요한 부분을 제외한 다른부분들을 지우는 것이다.symbol table과 section, 컴파일러/링커 관련 내용 등 여러가지 실행에..
2024.07.15
no image
main 함수 호출, 종료되는 과정
elf 파일을 보통 디버깅 할 때 main문부터 확인하는게 일반적이다. 그러나 pwnable.xyz의 Dirty_Turtle이란 문제를 보면 main함수가 호출되기까지, 종료된 후의 과정을 알아야한다.1. ELF 헤더 확인우선 readelf -h 명령어로 현재 challenge라는 바이너리를 확인한 결과이다. 엔트리 포인트 주소를 보면 0x4006c0을 가리키고 있는데 해당 주소가 무엇인지 IDA로 확인해보자.해당 주소는 _start 함수이다. 따라서 _start 함수가 처음에 호출된다.2. _start()void __fastcall __noreturn start(__int64 a1, __int64 a2, void (*a3)(void)){ __int64 v3; // rax int v4; // esi ..
2024.07.05
no image
pwntools의 활용
pwntools는 보통 CTF(Capture The Flag) 문제를 풀거나, wargame 문제를 풀 때 주로 사용된다. 아래는 실제 문제를 pwntools를 이용해 해결하는 과정이다. 문제는 pwnable.kr의 첫 번째 문제인 fd이다. pwnable.kr은 ssh 통신을 이용해 접속해서 문제를 푸는 방식이기에 ssh 접속을 이용한다. fd에 접속하고 나면 fd, fd.c, flag 가 보이는데 fd.c의 내용은 다음과 같다.argv를 정수로 바꾼 후에 16진수 0x1234를 빼준 값을 fd로 사용한다. len = read(fd, buf, 32)는 다음의 동작을 수행한다.fd : 파일 디스크럽터. 해당 값은 0, 1, 2가 들어갈 수 있는데 각각 표준 입력, 표준 출력, 표준 에러를 의미한다. 해당..
2023.06.06
no image
스택과 스택프레임
스택(stack)스택이란 “후입선출” 방식을 활용한 자료구조로, ‘쌓아놓은 더미’를 뜻한다.후입 선출이란 가장 최근에 들어온 데이터가 가장 먼저 나간다는 의미이다.스택은 푸시(push) 동작으로 데이터를 저장하고, 팝(pop) 동작으로 데이터를 인출한다.스택의 구조와 사용스택은 자료의 출력 순서가 입력 순서의 ‘역순’으로 이루어질 때 사용되는 자료구조이다.상단(top): 스택에서 입출력이 이루어지는 부분하단(bottom): 반대쪽 바닥 부분요소(element): 스택에 저장되는 것공백 스택(empty stack): 공백 상태의 스택포화 스택(full stack): 포화 상태의 스택시스템 스택 함수호출시스템 스택(system stack): 운영체제가 사용하는 스택복귀주소 기억: 함수의 실행이 끝나면 자신을..
2023.06.06
no image
GDB
프로그램을 만들 때 원인 모를 문제로 제대로 작동하지 않는 경우가 있음이러한 문제를 해결하기 위해서 디버깅을 위한 툴이 있는데, 그 중 하나가 gdb이다.gdb의 명령어gdb 프로그램 명: gdb 시작q(quit) / ctrl + d: 종료file 프로그램명: 디버깅할 프로그램으로서 이 파일을 사용disas 함수명: 특정 함수의 어셈블리 코드 출력disas [주소][주소]: 주소 사이의 어셈블리 코드 출력jump *[주소]: 주소로 강제적 분기(주소 외에 행번호, 함수명도 가능)set{타입}[주소] = 값: 특정 메모리에 값을 지정한다.gdb 디버깅 실습과정먼저 c언어를 사용한 코드 하나를 작성한다.그 뒤 아무 소스코드를 짠다.a에 10을 넣고 b에 20을 넣고 그 값을 result라는 4바이트짜리 변수..
2023.06.06
no image
어셈블리어 명령어와 레지스터
셈블리어란? ‘기계어를 사람이 조금 더 이해하기 쉽게 발명된 언어’기계어와 1:1 대응을 하는 언어이다.어셈블리 명령어의 구성어셈블리어는 명령어들의 조합이다. CPU는 2진수로 모든 것을 처리하는데 어셈블리 명령어들도 2진수로 되어있다. 그러나 2진수로 된 것은 알아보기가 힘들기 때문에 mov, add와 같은 형태로 변환하여 보여진다.명령어 다음에 오는 레지스터 이름이나 값들은 operand라고 한다. mov %eax, %ebx에서 %eax를 제 1오퍼랜드, %ebx를 제2오퍼랜드라고한다. mov %eax, %ebx는 C언어로 보면 ebx = eax인 경우와 같다. eax에 저장된 값을 ebx에 할당한다.(특정 장소(주로 메모리상에서)에서 특정 장소(주로 레지스터)로 데이터를 읽어 와서 적재한다.‘L1:..
2023.06.06