leesu0605 102

국민대학교 알고리즘 경시대회 후기

어제 국민대학교에서 알고리즘 경시대회를 개최해 참가했다. 문제는 실버1 ~ 골드2 사이 정도로 나왔고, 난이도가 어렵지 않아 올솔을 할 수 있었다. 그러나 문제가 쉬웠기 때문에 올솔러들이 많이 나와 장려상이나 동상 정도 받을 수 있을 것 같다. 정말 많이 성장했다는 느낌을 받을 수 있던 대회였고, 이 페이스를 유지하며 공부하면 내년엔 은상도 노려볼만 한 것 같다.

programming 2022.08.06

layer7 리버싱 6차시 과제(2) - x64dbg 명령어 써보기

목차 1. x64dbg명령어 쓰기 1. x64dbg명령어 쓰기 수업 중 x64dbg사용법에 대해 배웠다. 오늘은 사용법을 익히기 위해 간단한 드림핵 rev-basic-0 프로그램을 분석해보며 모든 명령어를 한 번씩 써볼 것이다. 써볼 명령어는 이와 같다. 하나씩 써보자. 일단 프로그램을 열어보았다. 그럼 F2부터 써보겠다. F2명령어는 코드에 브레이크 포인트를 설정하는 명령인데, 이를 설정하면 프로그램을 continue로 실행시켜도 그 부분에서 반드시 멈추게 된다. 즉, 프로그램을 디버깅할 때마다 원하는 곳으로 이동시켜야하는 수고를 하지 않아도 된다. 일단 shift + f12를 사용해 문자열 탐색을 한 후, 가장 수상해보이는 문자열을 클릭해 그 부분을 따라갔다. 문자열 참조를 클릭하면 이런 식으로 모든..

reversing 2022.08.03

Layer7 리버싱 6차시 과제(1) - ELF, PE 파일 정리

목차 1. ELF 2. PE 1. ELF ELF란? Executable and Linkable File의 약자로, 리눅스 상에서 컴파일을 하게 되면 ' ... -> 오브젝트 파일 -> 링킹 -> 실행 파일'이 되는데, 이 오브젝트 파일과 실행 파일 같이 뭔가 실행할 수 있는 파일이 바로 ELF파일이다. 또한, 라이브러리도 ELF파일이다. 이 ELF 파일은 ELF 헤더와 프로그램에서 쓰이는 데이터로 구성된다. ELF 파일은 이렇게 구성되어 있다. 저 ELF Header 부분이 파일 구조를 알려주는 부분이고, 나머지는 파일의 데이터를 저장한다. ELF 헤더부터 알아보자. 이것이 ELF 헤더에 어떤 값이 들어가야할지 정의한 표이다. 표의 앞부분 몇가지를 한 번 알아보자. · 0x00오프셋부터 표에 매직 넘버라..

reversing 2022.08.03

Layer7 리버싱 5차시 과제(3) - prob4 분석

목차 1. prob4 분석 및 코드 복원 1. prob4 분석 및 코드 복원 main함수를 뜯어봤다. 처음에 시작하자마자 fopen으로 파일을 여는 걸 볼 수 있는데, 한 번 어떤 파일인지 확인해보자. fopen은 첫 번째 인자가 파일 이름, 두 번째 인자가 파일 열기 모드이므로 첫번째 인자에 파일 이름이 들어있을 것이다. 그랬더니 이런 문자열이 나왔다. /dev 경로에 있다는 건 문제 제작자가 직접 urandom 파일을 만들었을 확률은 적으니 인터넷에 무슨 파일인지 검색해봤다. 검색해보니, urandom에선 절대 예측 불가능한 문자열을 준다는 사실을 알게 됐고, 다음 함수를 분석하기 시작했다. rbp-0x10에 fopen으로 얻은 파일 디스크립터를 저장하고, 4바이트 1블록를 읽어와 rbp-0x1c에 ..

reversing 2022.08.01

layer7 리버싱 5차시 과제(2) - prob3 분석

목차 1. prob3 분석 및 코드 복원 1. prob3 분석 및 코드 복원 일단 gdb를 켠 후, main 함수를 뜯어보았다. 하나씩 분석해보자. 처음에 스택프레임을 만든 후, time 함수를 호출하고 있다. time의 인자는 하나로, 원래는 NULL이 들어가지만 NULL은 0이기 때문에 0x0을 edi에 복사해 인자로 전해주었다. 그 바로 다음 코드에선 time의 결과값으로 srand를 호출하고 있는데, 이는 같은 시드라면 언제 실행해도 같은 랜덤값이 나오는 걸 방지하기 위해 1초마다 바뀌는 시드값을 이용한 것이다. 다음 코드에선 rbp-0xc에 있는 값을 0x0으로 만들고, main+143으로 점프하고 있다. 이젠 익숙해진 for문 전개이다. 아마 rbp-0xc에 반복횟수를 저장한 for문일 것이다..

reversing 2022.08.01

Layer7 리버싱 5차시 과제(1) - prob5 풀이

목차 1. prob5 분석 및 코드 복원 1. prob5 분석 및 코드 복원 일단 main 함수를 뜯어보자, 처음에 read를 호출하는 장면을 볼 수 있다. read함수는 생소할 수 있으니 설명을 해보겠다. read는 말그대로 입력을 받아오는 함수인데, 맨 앞에 파일 디스크립터를 줄 수 있어 사용자 입력, 파일 등 여러 곳에서 입력을 받을 수 있다. 여기서는 0x0(standard input)으로 주는 것으로 보아 사용자로부터 입력을 받는 것 같다. 두 번째 인자로는 버퍼 주소를 줄 수 있는데, [rbp-0xd0]을 주는 장면에서 버퍼 위치가 [rbp-0xd0]이라는 사실을 알 수 있다. 세 번째 인자로는 입력받을 사이즈를 지정해줄 수 있다. 0xc8을 인자로 주는 것으로 보아 사용자로부터 0xc8보다 ..

reversing 2022.08.01

Layer7 리버싱 4차시 과제(2) - prob2 풀이

목차 1. prob2 분석 및 페이로드 제출 1. prob2 분석 및 페이로드 제출 분석을 시작해보자. 일단 처음에 아까도 봤던 함수 프롤로그(스택 프레임 생성)이 보인다. rsp에서 0x20을 뺐으므로 지역변수 크기는 대략 32바이트 정도 될 것이다. 아까 prob1을 분석할 때도 봤던 스택 카나리가 또 나왔다. 스택 카나리를 사용하므로 아마 main함수의 맨 아래쪽에는 스택 카나리값이 ebp-0x8에 잘 들어있는지 확인하는 코드가 있을 것이다. 존재한다. 그럼 이 두 부분을 제외하면 아마 모두 사용자가 직접 작성한 코드가 될 것이다. 분석을 시작하려했는데, main이 시작하자마자 srand@plt라는 함수를 호출한다. srand는 rand함수를 사용하기 전 랜덤값을 만들어낼 시드를 정해주는 함수이다...

reversing 2022.07.27