System&Write up 87

[pwnable.kr] Toddler's Bottle - random

[pwnable.kr] Toddler’s Bottle – random 코드는 이렇습니다. rand 함수는 난수를 생성하는 함수입니다. rand 함수는 seed표의 값에 따라 발생하는 난수의 값이 달라지는데, srand 함수로 seed 값을 정해줄 수 있습니다. seed 값이 다르다면 rand 함수에서 발생시키는 난수 또한 달라지게 됩니다. 그래서 시간 값을 매개로 초기화하게 되면 불규칙적인 난수를 생성하게 됩니다. 하지만 위의 코드에서는 seed 값을 주지 않았기 때문에 매 프로그램 실행 시마다 같은 난수를 얻게 됩니다.동일한 seed표에서 값을 참조했기 때문이죠. 즉, 랜덤이 아니라는 것입니다. 그럼 gdb에 올려서 random값을 확인한 다음에 random 값과 0xdeadbeef를 xor 한 결과를..

[pwnable.kr] Toddler's Bottle - passcode

[pwnable.kr] Toddler’s Bottle – passcode 내용을 보아하니 there was some compiler warning. 컴파일러에서 경고가 나는 듯 합니다. ssh로 접속해서 code를 열어봅니다. warning을 확인해보기 위해 code를 가져와서 직접 컴파일 해봤습니다. login 함수에서 scanf 함수를 호출할 때, 취약한 부분이 있는 것 같습니다. 원래 scanf 함수에서는 &var, 변수의 주소를 받아 참조해서 값을 저장합니다. 하지만 저기 변수의 주소가 아닌 변수 자체를 넣었기 때문에, 변수에 들어있는 값을 주소로 참조하여 %d로 받아서 저장합니다. 즉, 저 변수에 원하는 주소가 들어있다면, 그 주소의 값을 덮어쓸 수 있습니다. welcome 함수가 끝나고, 스택..

[pwnable.kr] Toddler's Bottle - flag

[pwnable.kr] Toddler’s Bottle – flag 바이너리 파일 하나를 줍니다. 리버싱 문제인 것 같고 packed present라는 걸 보면 바이너리가 패킹 되어 있을 거라고 생각됩니다. (그래서 패킹에 글들을 읽어보고 왔습니다.) ELF 64-bit고 정적 링크입니다. IDA로 열어보겠습니다. String을 보면, UPX로 패킹 된 파일이네요. UPX는 대표적인 Compressor로 실행 파일의 압축 목적으로 사용하고, unpacking이 매우 쉽다고 합니다. 툴을 다운로드 받아서 UPX 언패킹을 하겠습니다.(사용법은 http://lonnia.tistory.com/30 블로그에서 참고했습니다.) upx –d [파일명] -d 옵션은 decompress입니다. 다시 IDA로 열어보겠습니다..

[pwnable.kr] Toddler's Bottle - bof

[pwnable.kr] Toddler’s Bottle – bof 코드를 확인하겠습니다. key를 0xdeadbeef로 넣어줬는데 그 값이 gets()함수로 인해서 overflowme[32]에서 overflow가 발생하고, 그걸 이용해서 key를 0xcafebabe로 변조하면 쉘이 실행되는 코드입니다. 바이너리를 다운 받아서 gdb에 올려봅시다. func 함수를 보면 ebp-0x2c가 gets 함수의 인자로 넘어가는데, overflowme의 시작 주소라는 것을 알 수 있습니다.그리고 func의 첫 번째 인자인 key는 ebp+0x8라는 걸 알 수 있습니다. python으로 overflowme와 key의 거리를 구하겠습니다. 그럼 52byte만큼 더미를 주고 그 뒤를 0xcafebabe를 주면 될 것 같습니..

[pwnable.kr] Toddler's Bottle - collision

[pwnable.kr] Toddler’s Bottle – collision 접속해서 파일을 확인합니다. 코드를 열어보면, 해석해보면 20byte만큼 문자열을 argv[1]에 입력 받습니다.그리고 그걸 4byte씩 나눠서(int *) 다 더합니다. 20byte -> 4byte + 4byte + 4byte + 4byte + 4byte그 값을 hashcode(0x21dd09ec)와 비교해서 같으면 flag를 출력하는 코드입니다. 일단 hashcode의 값이 얼마인지 확인해보겠습니다. 20byte 문자열을 5개로 나누니, 간단하게 저 hash값을 5로 나누면 나머지는 4가 나오고 몫은, 이렇습니다. 4개의 문자열은 0x6c5cec8로 채우고, 나머지 1개는 나머지 4를 더해준 0x6c5cecc로 채우겠습니다. ..

[pwnable.kr] Toddler's Bottle - fd

[pwnable.kr] Toddler’s Bottle – fd 접속해서 파일을 확인합니다. 코드를 열어보면, 이렇게 argv[1]에 인자를 받고 그 값에서 0x1234를 뺀 값을 fd에 저장합니다.그리고 read 함수로 읽은 값을 buf에 저장하고, “LETMEWIN\n” 문자열과 buf를 비교해서 같으면 flag를 출력하는 코드입니다. 여기서는 read 함수에 대한 이해가 필요한데, 원형은 이렇습니다.ssize_t read (int fd, void *buf, size_t nbytes) fd는 파일 디스크립터이고, buf는 읽은 값을 저장할 공간, nbytes는 읽을 버퍼의 크기입니다. fd를 이용해서 파일을 컨트롤 할 수 있는데, 0, 1, 2는 각각 stdin, stdout, stderr로 예약되어 ..

LOB nightmare -> xavius Write up

LOB nightmare -> xavius ID : nightmarePasswd : beg for me 접속해서 ls 명령어로 파일을 확인합니다. 으악 복잡합니다. 일단 주소의 상위 2바이트가 \x08, \xbf 이면 종료, library 영역도 막고 있는 것 같은데, leave, ret으로만 검사하고 상위 2바이트가 \x40이여도 상관 없는 것 같습니다. 그리고 overflow가 발생하는 부분을 보면, fgets로 받고 있는데, stdin을 인자로 전달합니다. 그럼 stdin을 찾아봅시다. stdin에는 우리가 전달한 값이 남아 있을 것입니다. gdb로 열어보겠습니다. 그리고 main에 break point를 걸고 stdin을 확인해보겠습니다. stdin을 보면 이렇게 있고, 이제 입력을 하기 위해 다..

System&Write up/LOB 2017.11.15

LOB succubus -> nightmare Write up

LOB succubus -> nightmare ID : succubusPasswd : here to stay 접속해서 ls 명령어로 파일을 확인합니다. code를 보니 첫 번째 Return Address는 strcpy() 함수에 걸어줘야 하고 두 번째 Return Address는 AAAA로 덮어씁니다. 그래서 한 번에 해줘야 할 것만 같은데, strcpy 함수의 기능을 살펴보면, 어떤 주소에 어떤 문자열을 덮어쓸 수 있습니다. 그럼 AAAA로 덮여진 두 번째 Return Address의 값을 strcpy() 함수를 이용해서 셸코드가 있는 주소로 넘겨주면 될 것 같습니다. 셸코드를 환경 변수에 등록하도록 하겠습니다.export SC=$(python –c ‘print “\x90”*13000 + "\x31\x..

System&Write up/LOB 2017.11.14
반응형