전체 글 292

[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

LOB zombie_assassin -> succubus Write up

LOB zombie_assassin -> succubus ID : zombie_assassinPasswd : no place to hide 접속해서 ls 명령어로 파일을 확인합니다. 소스코드가 굉장히 기네요. 연속 함수 호출 문제인데, strcpy() 부분에서 overflow가 발생하고 Return Address(argv[1]+44)가 DO() 함수의 주소여야 하는군요. 그리고 buffer+48부터 100byte까지는 사용 가능한 걸로 보입니다. DO부터는 check라는 전역 변수로 꼭 DO() GYE() GUL() YUT() MO() 순서로 호출해야 하도록 만들어 놓았습니다. 그리고 MO()에서 cmd라는 인자를 받아서 system() 함수의 인자로 넘기는데, 이 인자를 &/bin/sh로 해주면 될 것..

System&Write up/LOB 2017.11.13

LOB assassin -> zombie_assassin Write up

LOB assassin -> zombie_assassin ID : assassinPasswd : pushing me away 접속해서 ls 명령어로 파일을 확인합니다 code를 보면 이렇습니다. 전 단계 giant처럼 strcpy()가 아닌 strncpy()를 사용하고 있습니다. FPO 문제와 비슷한데요, 오히려 1byte만 조작할 수 있었을 때보다 지금이 더 쉬운 것 같습니다.FPO(LOB golem -> darkknight) -> http://jaemin8852.tistory.com/48 메모리 구조는 이렇습니다. | buffer(40) | sfp(4) | ret(4) | 여기서 sfp를 변조하고 Return Address를 leave - ret으로 변조한다면,Return Address는 결국 sfp..

System&Write up/LOB 2017.11.12

LOB giant -> assassin Write up

LOB giant -> assassin ID : giantPasswd : one step closer 접속해서 ls 명령어로 파일을 확인합니다. code를 열어보면 stack과 library 영역을 막고 있네요. code 영역으로 공격해보겠습니다. strcpy()에서 크기 제한을 두지 않고 있습니다.argv[1][47]이 ‘\xbf'과 ‘\x40’만 아니면 됩니다. 저는 code 영역에 ret을 다시 이용하고자 합니다.leave를 하고 ret을 합니다. 근데 Return Address가 다시 ret(자기 자신)이라면,leave – ret – ret다시 돌아와서 결국 Return Address는 마지막 ret 명령할 때 입니다. | sfp | ret(&ret) | stack or library |이렇게 변..

System&Write up/LOB 2017.11.09

LOB bugbear -> giant Write up

LOB bugbear -> giant ID : bugbearPasswd : new divide 접속해서 ls 명령어로 파일을 확인합니다. cat으로 code를 열어보면 소스가 긴데요. 간단히 해석하자면, library에 있는 execve 함수의 주소를 execve_addr 포인터 변수에 저장하고, 그 주소와 Return Address를 비교해서 같지 않으면 종료됩니다. 즉, 이 문제는 execve 함수를 이용해서 풀어야 한다는 것입니다. 그럼 execve 함수는 무슨 함수일까요? int execve (const char *filename, char *const argv [], char *const envp[]);원형은 이렇습니다. *filename에는 파일의 절대 경로를, * argv []에는 그 파일을..

System&Write up/LOB 2017.11.08
반응형