KDHzoot's Github

Code for study, project, etc

자세히보기

전체 글 90

[CSAW CTF 2013] Exploitation3

복잡한 쉘코드는 건너뛰고 생각하자. 코드를 따라가면서 읽다보면 대충 id와 password같은 문자열이 보인다. csaw2013S1mplePWD 입력하면 로그인이 되고 "Entry info: "가 뜬다. ida로 코드를 읽어보면 먼저 사용자가 버퍼에 입력할 entry의 길이를 입력하고 버퍼에 entry를 입력한다. 여기서 주의해야할 점은 entry의 길이가 1024미만이어야 한다는 것이다. 1234n = (signed __int16)entry_len;if ( (unsigned int)((signed __int16)entry_len + 1)

정보보안/CTF 2018.11.10

[CSAW CTF 2013] Exploitation2

main 코드가 엄청 길어서 당황했다. 게다가 소켓코드라서 뭔지 하나도 모른다. 대충 exploit2 실행시켜두고 cmd를 새로 켜서 페이로드를 작성했다. 소켓으로 로컬 31337포트에 연결하니 에러 없이 handle 함수로 넘어간다. main함수는 무시하기로 했다. 12345678910111213141516171819202122232425262728void __cdecl handle(int newsock){ unsigned int v1; // eax char buffer[2048]; // [esp+1Ch] [ebp-80Ch] unsigned int cookie; // [esp+81Ch] [ebp-Ch] cookie = 0; memset(buffer, 0, sizeof(buffer)); v1 = time..

정보보안/CTF 2018.11.09

[pwnable.kr] shellshock

기본적인 shellshock에 대한 문제이다. shellshock 취약점은 기존 쉘에서 쉘을 다시 호출 할 경우 환경변수를 로딩하면서 생기는 취약점이다. (아마도) export로 환경변수를 설정할 때 1export x='() { echo test; }'cs 로 설정해주면 x는 함수가 아니라 문자열로 인식된다. 이때 다시 쉘을 호출하게 되면 문자열을 둘러싸던 ''가 사라지면서 함수의 형태가 된다. 1x= () { echo test; }cs 근데 초반에 환경변수 설정을 1export x='() { echo test; }; /bin/cat flag'cs 로 해주었을 경우 다시 쉘을 호출하게 되면 환경변수 x가 함수가 되는 동시에 뒤에 붙어있는 /bin/cat flag 부분이 실행된다. 이때 호출되는 쉘의 권한..

[pwnable.kr] leg

leg문제는 arm을 보여주기위한 문제이다.어셈블리어 코드인데 어딘가 다르다.arm 기반으로한 코드이기 때문이다. 우리가 알아야 되는 것은 key1, key2, key3 함수의 리턴값이다. 코드를 보면 알겠지만 함수가 끝난뒤 항상 r0 레지스터에 있는 값을 어딘가로 복사한다.여기서 우리는 함수의 리턴값이 r0에 저장된다는 것을 알 수 있다. 그럼 이제 key함수들에서 r0이 어떻게 조작되는지만 알면 된다. key1 함수이다. r0는 r3의 값을 덮어쓰고 r3는 pc의 값을 덮어쓴다.따라서 리턴되는 값은 0x00008cdc에서 pc값이다.여기서 pc란 프로그램 카운터의 줄임말로 다음으로 실행되어야 하는 명령어를 가르킨다. 여기서 주의해야될 점은 arm에서의 pc계산 방법이다.arm에서 명령 실행단계는 4단..

[pwnable.kr] input

pwntools 사용법을 알려주기 위해 만든 문제 같다. 특별한 것 없이 코드에서 원하는 대로 프로그램에 입력을 해주면 된다. 입력방법을 찾아보느라 오래걸렸다. 기본 디렉토리에서는 파일을 생성할 수 없으므로안보이지만 존재하는 tmp 폴더로 들어가 자신의 폴더를 만들고거기에 flag와 elf파일을 복사해서 작업해야한다. exploit code123456789101112131415161718192021222324252627282930313233from pwn import * #setting argvs for stage 1argvs = [str(i) for i in range(100)]argvs[ord('A')] = "\x00"argvs[ord('B')] = "\x20\x0a\x0d"argvs[ord('C')..

[pwnable.kr] random

rand()함수와 srand()함수의 차이점을 알면 풀 수 있다. rand()함수는 한번 실행되면 값이 고정돼서 변하지 않는다.gdb로 뜯어서 key값에 저장된 난수 값을 확인하면 쉽게 풀 수 있다. 255는 16진수로 ff이다.ff 좌우에 0x00007ffd와 0x6b8b4567이 있다.0x00007ffd는 다시 실행해보니 값이 바뀌었으므로 key값은 0x6b8b4567이다. 입력과 key를 xor 했을 때 0xdeadbeef가 나와야 되므로입력은 0xdeadbeef에 key를 xor한 값이다. exploit code

[pwnable.kr] passcode

치킨은 맛있다. c코드만 보면 쉬워보인다. 그런데 해보면 segfalt가 뜬다.scanf에서 인자를 변수의 주솟값이 아니라 변수의 값 자체를 넘겨주기 때문이다. 따라서 system함수를 실행시키기 위한 다른 방법을 찾아야한다.먼저 생각해 볼 수 있는 것이 welcome에 있는 name 배열을 이용하여 welcom 함수의 ret를 system함수로 조작해주는 것이다.그러나 입력받는 값이 100글자이고 canary가 걸려있어 bof는 안된다.마찬가지로 nx가 걸려있어서 shellcode도 안된다. 여기서 알아내기 힘든것이 name배열의 96에서 100번째 글자 4바이트가login 함수의 password1의 위치이다. 어셈블리어 코드를 보면 welcome 함수와 login 함수의 호출이 바로 인접해서 일어남으..

[DEFCON CTF 2015] r0pbaby

결론부터 말하자면 못풀었다.대회가 끝난뒤 local에서 푸느라 local libc를 사용해야 됐다.PIE가 걸려있어서 ROP가젯을 libc에서 구해야 되는데 pop rdi; ret 가젯이 libc에 없었다.왜 그런지는 나중에 알 기회가 있겠지 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495__int64 __fastcall main(__int64 a1, char **a2, char **a3){ signed int v3; // eax ..

정보보안/CTF 2018.11.08