본문 바로가기

2017/08

flag 뭔진 몰라도 binary file이고 리버싱 하란다. 일단 받아다 hexeditor로 열어보았다. UPX로 패킹된 ELF파일이다. 우선 리눅스에 받아다가 unpacking 해서 실행시켜보자. malloc으로 할당받은 공간에 flag값을 저장할거란다. 일단 디버깅해보자 에서 malloc을 실행시키고 에서 flag가 있는 주소값을 rdx에 넣어주고 있다. 그럼 까지만 실행시킨 뒤 rdx의 주소에 위치한 문자열을 확인해보자 rdx에는 주소값 0x496628이 입력되어 있다. 주소값에 입력된 문자열을 확인하는 명령어는 x/s [address] 이다. 못찾고 찾은 척 한거 아니다.
bof 이번엔 그 유명한 buffer overflow를 사용하는 문제...인가보다 내가 bof를 하다니 소스부터 보자 0xdeadbeef로 준 parameter가 0xcafebabe이면 flag를 준다고 한다. 그리고 대놓고 overflow하라고 gets함수에 표시를 해 주었다. 친절하게 알려주었으니 한번 해보자. 우선 func함수에선 길이 32의 char배열 하나만 선언했다. 이 부분을 assembly코드로 확인해보자 call 명령어에 함수를 이렇게 사용하지만 call을 호출한 순서로 보아 은 gets인걸 알 수 있다. 그럼 mov로 받은 [ebp-0x2c]는 변수 overflowme이다. 이 함수는 overflowme로 선언한 32byte 외에도 dummy값으로 12byte를 ebp로부터 선언했다. 따라서 ..
collision md5 hash의 collision을 발견했단다. 대단하다. 나도 함 발견하게 소스코드를 보자. main의 argument로 받은 20byte를 parameter로 check_password를 실행해 받아온 값이 hashcode의 값과 같으면 flag를 볼 수 있다. 그럼 check_password함수의 코드를 보자 ( 너무 길어서 한번에 설명하자니 글만 많아져 사진을 잘랐다. ) parameter로 넘어온 값의 pointer를 int *로 캐스팅한다. int는 4byte를 갖는 data type이므로 int p[5]와 같은 셈이다. check_password함수는 이 int형 배열의 값들을 모두 더한 값을 반환한다. 즉 argument값으로 0x21DD09EC/5를 한 값을 5번 연달아 입력해주면 된다..
fd pwnable.kr에서 가장 쉬운 Toddler's bottle, 그 중 제일 기본적인 fd문제이다. 우선 소스코드를 확인해보자. main의 argument로 받은 값을 atoi함수를 사용해 int로 변환시킨다. argument로는 int값을 줘야 되는 것 같다. 정수형으로 바꾼 argument값에서 0x1234를 뺀 값을 fd라는 변수에 저장하고 read()함수에서 file descriptor로 사용해 값을 읽어와 buf에 저장한다. 그리고 이 값이 문자열 "LETMEWIN"과 같으면 flag를 보여준다. 보통 file descriptor는 open함수를 사용해 생성하지만 이 코드에선 어디에서도 open함수를 사용하지 않는다. 즉 기존에 있는 file descriptor를 사용해야 한다. 리눅스에선 다..