본문 바로가기

SYSTEM HACKING

[SWING] Pwnable 01 - gdb, pwntools 설치

gdb 설치

 

https://github.com/pwndbg/pwndbg

 

버전 업데이트를 해야하나?

 

 

아래 링크를 참고해서 22.04로 업데이트를 해주었다.

 

https://jjeongil.tistory.com/2105

https://askubuntu.com/questions/1483400/ubuntu-update-to-20-04-failed

 

용량이 부족해서 용량도 늘려줬다. 힘들었다...

 

[리눅스 개념] 디스크 용량 확장방법 :: SEOULSENSE (tistory.com)

VM 리눅스 디스크 용량 확장하기 - 달소씨의 하루 (dalso.org)

 

yum 안 쓰고 apt 쓰긴 했는데... gparted 깔았고...

 

sudo: yum: command not found 해결 - ubuntu nginx에 yum 설치 - 인공지능 (investechnews.com)

 

Ubuntu 에서 갑자기 Read-Only file system 에러가 발생 하는 경우 | by jelly | Medium

Why e2fsck is Aborting and How to Fix It | DeviceTests

 

뭔 에러가 났는데 read only라서 크기 조정이 안된다질 않나, /dev/sda1 umount가 안된다질 않나, busy라질 않나... 근데 그냥 어쩌다보니까 해결이 됐다. 아직도 왜 됐는지 모르겠다. 과제랑 관련있는건 아닌데 기록 삼아 겸사겸사.

 

 

#include <stdio.h>
int main(void) {
  int sum = 0;
  int val1 = 1;
  int val2 = 2;
  sum = val1 + val2;
  printf("1 + 2 = %d\n", sum);
  return 0;
}

 

 

실행 파일 ELF

헤더: 실행에 필요한 정보

섹션: 컴파일된 기계 코드, 프로그램 문자열

 

Entry

 

 

진입점 (Entry Point, EP)은 0x401050.

DISASM 영역 화살표가 가리키는 것이 현재 rip 값이다.

 

Context

 

메모리들의 상태, 즉 프로그램이 실행되는 맥락을 뜻한다.

Context는 REGISTERS, DISASM, STACK, BACKTRACE (현재 rip에 도달할 때까지 어떤 함수가 중첩되어 호출됐는지) 총 4개의 영역으로 구분한다.

 

 

Break & Continue

 

 

Run

 

 

gdb 명령어 단축키 

 

  • b: break
  • c: continue
  • r: run
  • si: step into
  • ni: next instruction
  • i: info
  • k: kill
  • pd: pdisas

 

Disassembly

 

Navigate

 

ni (next instruction) si (step into)
어셈블리 명령어를 한 줄씩 실행하며 자세히 분석한다
서브루틴의 내부로 들어가지 않는다 서브루틴의 내부로 들어간다

 

main 함수에서 printf 호출 지점까지 실행
printf 바로 다음으로 rip 이동
printf 함수 내부로 rip 이동
main 함수 위에 printf 함수가 쌓임

 

 

Finish

 

함수의 끝까지 한번에 실행한다.

 

 

Examine

 

가상 메모리에 존재하는 특정 주소에서 원하는 길이와 형식의 데이터를 인코딩해 보여주는 명령어, x.

 

rsp부터 80바이트를 8바이트씩 hex 형식으로 출력
rip부터 5줄의 어셈블리 명령어 출력
특정 주소의 문자열 출

 

Telescope

 

강력한 메모리 덤프 기능이다.

특정 주소의 메모리 값만 보여주는게 아니라, 메모리가 참조하고 있는 주소를 재귀적으로 탐색한다.

 

 

Vmmap

 

가상 메모리의 레이아웃을 보여준다.

매핑된 영역이면 파일의 경로까지 보여준다.

 

 

 

pwntools 설치

 

 

traceback (most recent call last)... 오류인가?

 

 

 

process & remote

 

process: 로컬 바이너리 대상으로 익스플로잇, 보통은 테스트와 디버깅 용도

remote: 원격 서버 대상으로 익스플로잇, 실제 공격

 

send

 

데이터를 프로세스에 전송

 

recv

 

프로세스에서 데이터를 받는다.

 

recv(n): 최대 n 바이트를 받고 그보다 덜 받아도 에러가 나지 않는다.

recvn(n): n 바이트를 받지 못하면 계속 기다린다.

 

packing & unpacking

 

리틀 엔디언의 바이트 배열로 변경하거나 반대로 해야 할 때.

 

interactive

 

셀을 획득했거나 익스플로잇에 직접 입력하면서 출력을 확인하고 싶을 때.

호출하고 나면 터미널로 프로세스에 데이터를 입력하고 출력을 확인한다.

 

ELF

 

익스플로잇에 사용될 수 있는 각종 정보가 기록되어 있다.

 

context.log

 

익스플로잇 디버깅.

context.log_level 변수로 로그 레벨을 조절한다.

 

shellcraft

 

저장된 셸 코드를 꺼내 써도 되지만 정적으로 생성된 셀 코드는 실행될 때 메모리 상태, 프로그램에 따른 길이, 구성 가능한 문자의 종류 등의 조건을 반영하기 어렵기 때문에 직접 작성하기도 한다.

 

asm

 

어셈블 기능.

대상 아키텍처를 미리 지정해야 한다.

 

 

solve.py

 

 

문제풀이 과제

- pwntools를 활용하여 아래의 zip 파일 속 "swing"을 실행하였을 때 다음과 같이 출력되도록 파이썬 스크립트(solve.py) 작성

 

 

10개의 랜덤 곱셈 문제를 생성해 틀리면 오답이라 출력하며 종료하고, 모든 문제를 맞히면 성공을 출력하는 코드이다.

변수는 랜덤 숫자 a, b와 사용자의 답변을 저장하는 ans.

srand(time(0)); 로 난수 생성기에 현재 시간을 시드하여 프로그램을 실행할 때마다 생성되는 난수가 달라지도록 한다.
프로그램이 10번 반복되는 for 루프 내에서 rand() % 1001;을 사용하여 0부터 1000까지 두 개의 난수 a와 b를 생성한다.
문제 번호, a, b를 "i. a X b" 형식으로 출력한다.
scanf("%d", &ans);로 답변을 입력 받는다.
사용자의 답변(ans)이 a와 b의 곱과 같은지 확인하고, 동일하지 않으면 "Wrong answer!"을 출력하여 0을 반환하고 프로그램을 종료하여 루프와 프로그램을 종료한다.
사용자의 답이 10개의 질문에 모두 맞으면 루프가 완료되고 프로그램은 "Success!"를 출력한다.