Upload
takesako
View
1.739
Download
0
Embed Size (px)
DESCRIPTION
YAPC::Asia 2010 Tokyo Day 1 (Yoshinori TAKESAKO)
Citation preview
プログラミングで
何文字
使ってますか?
How many characters?
when if you write the
(Perl) program.
8
< > + .[ ] - ,
Brainf*ck : 8 characters only
とても少ない
Too Small.
Perl
100+
$_=~/([^¥-]|)/;#
US-ASCII 7bit(100文字以上)
大きすぎる
Too Big.
1000+
Python
Unicode++
絵文字 大杉
Too emoji.
✎ U+270E (Lower Right Pencil)
type(’pen✎’) <type ’str’>
via. http://d.hatena.ne.jp/nishiohirokazu/20100730/1280509687
Unicode Eomoji : Postfix type declarations
16
記号に意味を持たす
プログラミング言語
Symbolic
Coding
ASCII without AlphaNum(no alphabet number)
0x20 0x30 0 0x40 @ 0x50 P 0x60 ` 0x70 p0x21 ! 0x31 1 0x41 A 0x51 Q 0x61 a 0x71 q0x22 ' 0x32 2 0x42 B 0x52 R 0x62 b 0x72 r0x23 # 0x33 3 0x43 C 0x53 S 0x63 c 0x73 s0x24 $ 0x34 4 0x44 D 0x54 T 0x64 d 0x74 t0x25 % 0x35 5 0x45 E 0x55 U 0x65 e 0x75 u0x26 & 0x36 6 0x46 F 0x56 V 0x66 f 0x76 v0x27 ' 0x37 7 0x47 G 0x57 W 0x67 g 0x77 w0x28 ( 0x38 8 0x48 H 0x58 X 0x68 h 0x78 x0x29 ) 0x39 9 0x49 I 0x59 Y 0x69 i 0x79 y0x2A * 0x3A : 0x4A J 0x5A Z 0x6A j 0x7A z0x2B + 0x3B ; 0x4B K 0x5B [ 0x6B k 0x7B {0x2C , 0x3C < 0x4C L 0x5C ¥ 0x6C l 0x7C |0x2D - 0x3D = 0x4D M 0x5D ] 0x6D m 0x7D }0x2E . 0x3E > 0x4E N 0x5E ^ 0x6E n 0x7E ~0x2F / 0x3F ? 0x4F O 0x5F _ 0x6F o
;"#{",$/*";}";'[!&,,#>,,`^`[%!@%@!-~`-~/(&,,-!!-!!-!+(&-,+>,,`[-!|-!}/////////$$$[,-(@),~,&(@-$@,+,)(@,(@$,!,",/(@!(@"(@#$@,{,^(@%(@&$@,!,.(@*(@."=:$_]!$-~!`{~!';%#;$^_='_^)./}`;@,@<},^^,]`@_{',$^_^='/,@@[_(^,@/-]|;,@|<.}@',$^_=~('(?{$^_=~'.('_^""'^'+,|/'."-".('$%'^';{'.'(-:^;'.('[)]@'^'>_<,').'$^_})')))#;_=[*'`'..%.~.]*%;;;$_=%+%++(??%?===???_[(_=~/¥{/).-@+(_=~/~/)]:%%%<<(?!*(?+-?()));_=([*%/!/..%!/!]+[*%]:]..%)@)]+[*%.[...%.`.]+[*%.{...%.}.])*%(=~_~='_');$><<$_%(/¥)=~_~='_'¥*=/=~_)+$_%(/~_~='_'¥-/=~_)+$_%(/¥-=~_~='_'¥./=~_)+$_%(/¥-=~_~='_'¥./=~_)+$_%(/_~='_'¥./=~_)+$_%(/'&/=~_)+$_%(/='_'%/=~_)+$_%(/=~_~='_'¥+/=~_)+$_%(/¥.=~_~='_'¥//=~_)+$_%(/',/=~_)+$_%(/~='_'¥//=~_)+$_%(/~='_''/=~_)+$_%(/=~_~='_''/=~_)+(??%?)==???($_%(/_~='_'¥(/=~_)+'(^-^)/'):$_%(/~_~='_'¥(/=~_)+'(-_-#)'+$_%(/='_';/=~_)+$_%(/'_'¥[/=~_)+$_%(/~='_':/=~_)+$_%(/~='_'¥[/=~_))+$_%(/'_'%/=~_)+$_%(/=~_~='_'#/=~_)+%))#*/=''[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')[_]][_](_[_][_]((_=-~-~''+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')[_]+(_+!'')[_]+(_+{}._)[_]+'¥''+[''+'_="',_|_<<_,_*_+_-~_,_-~_+_|_,_-~_+_|_,((_-~_+_|_)-~_)+',",',_<<_-~_,_-~_|_<<_-~_|_,_*_+_^_+_,_*_+_-~_,(_-~_+_|_)-~_,((_+-~_)*_)+'(',(_<<_-~_)-~_,~(~_-_+_),~_*_^~_*_+_,(_+_)*_,(_-~_+_|_)-~_,((_<<_-~_)-~_)+')=="',(_-~_+_|_)-~_,_*_+_,-~(_*_)+_,_*_+_-~_,_/_|_*_+_,(_<<_-~_)+'"?',~(_*-_+_),_-~_+_|_,_*_+_-~_,-_*~_+_,(_<<_-~_)+'(_+',~_*_^~_*_+_,~(_*-_+_),_<<_-~_|_,~(~_-_+_),~(~_<<_*_),~(_*-_+_),_<<_-~_,(_-~_+_|_)-~_,(-_*~_+_)+'.',-~(_*_<<_*_),~_^~_*_+_,_*_+_-~_,-_*~_+_,''+_%_+_/_,~(~_<<_*_),_*_+_-~_,~_*_^~_*_+_,(_<<_-~_)+'.',-_*~_+_,_*_+_-~_,_*_+_^_+_,_-~_+_|_,~(_*-_+_),_/_|_*_+_,(_*_+_-~_)+'(/.+¥¥¥¥)/,"")):',_*_+_^_+_,-_*~_+_,~(~_-_+_),~_*_^~_*_+_,(_<<_-~_)+'(_+"',_/_+_,~(_*-_+_),_<<_-~_|_,~(_*-_+_),_+-~_,_/_|_*_+_,-_*~_+_,~(~_-_+_),_*_+_^_+_,(_<<_-~_)+'!")'][(_+{})[_*_]+(_+{})[_]+(_+_/'')[_*_]+(_+{}._)[_]]('¥¥'+_/_)+'¥'')())()
No al-num Polyglot programming
(1) MS-DOS 8086 (2) Javascript
(3) Perl (4) Ruby
Perl 的特徵
# …
JavaScript 的特徵
/* … */
Ruby 的特徵
Ruby %#string#Perl q#string#
.com - 16bit MS-DOS 8086
self-replacex86 binary
CPU
01
32bit Linux
Linux system call programming (int 80H)
; NASM HelloWorld (Linux x86 ELF) using gcc; ; $ nasm hello.asm –f elf –o hello.o; $ gcc hello.o –o hello
section .data
msg db 'Hello, world!', 0x0Alen equ $ - msg ;
main:
mov eax, 4 ; system call number (sys_write)mov ebx, 1 ; file descriptor (stdout)mov ecx, msg ; message to writemov edx, len ; message lengthint 0x80 ; call kernel
mov eax, 1 ; system call number (sys_exit)int 0x80 ; call kernel
; sys_write(stdout, msg, len);; sys_exit;
section .text
2008/08/14 Webプログラミングクラス講座 29
0 sys_restart_syscall
1 sys_exit
2 sys_fork
3 sys_read
4 sys_write
5 sys_open
6 sys_close
7 sys_waitpid
8 sys_creat
9 sys_link
10 sys_unlink
11 sys_execve
12 sys_chdir
13 sys_time
14 sys_mknod
15 sys_chmod
16 sys_lchown16
17 sys_ni_syscall
18 sys_stat
19 sys_lseek
20 sys_getpid
21 sys_mount
22 sys_oldumount
23 sys_setuid16
24 sys_getuid16
25 sys_stime
26 sys_ptrace
27 sys_alarm
28 sys_fstat
29 sys_pause
30 sys_utime
31 sys_ni_syscall
32 sys_ni_syscall
33 sys_access
34 sys_nice
35 sys_ni_syscall
36 sys_sync
37 sys_kill
38 sys_rename
39 sys_mkdir
40 sys_rmdir
41 sys_dup
42 sys_pipe
43 sys_times
44 sys_ni_syscall
45 sys_brk
46 sys_setgid16
47 sys_getgid16
48 sys_signal
49 sys_geteuid16
50 sys_getegid16
51 sys_acct
52 sys_umount
53 sys_ni_syscall
54 sys_ioctl
55 sys_fcntl
56 sys_ni_syscall
57 sys_setpgid
58 sys_ni_syscall
59 sys_olduname
60 sys_umask
61 sys_chroot
62 sys_ustat
63 sys_dup2
64 sys_getppid
65 sys_getpgrp
66 sys_setsid
67 sys_sigaction
68 sys_sgetmask
69 sys_ssetmask
70 sys_setreuid16
71 sys_setregid16
72 sys_sigsuspend
73 sys_sigpending
74 sys_sethostname
75 sys_setrlimit
76 sys_old_getrlimit
77 sys_getrusage
78 sys_gettimeofday
79 sys_settimeofday
80 sys_getgroups16
81 sys_setgroups16
82 old_select
83 sys_symlink
84 sys_lstat
85 sys_readlink
86 sys_uselib
87 sys_swapon
88 sys_reboot
89 old_readdir
90 old_mmap
91 sys_munmap
92 sys_truncate
93 sys_ftruncate
94 sys_fchmod
95 sys_fchown16
96 sys_getpriority
97 sys_setpriority
98 sys_ni_syscall
99 sys_statfs
* linux-2.6.14/arch/i386/kernel/syscall_table.S (0-99/293)
x86
08048060 <.text>:8048060: b8 04 00 00 00 mov $0x4,%eax8048065: bb 01 00 00 00 mov $0x1,%ebx804806a: e8 0e 00 00 00 call 0x804807d804806f: 48 dec %eax8048070: 65 gs8048071: 6c insb (%dx),%es:(%edi)8048072: 6c insb (%dx),%es:(%edi)8048073: 6f outsl %ds:(%esi),(%dx)8048074: 2c 20 sub $0x20,%al8048076: 77 6f ja 0x80480e78048078: 72 6c jb 0x80480e6804807a: 64 21 0a and %ecx,%fs:(%edx)804807d: 59 pop %ecx804807e: ba 0e 00 00 00 mov $0xe,%edx8048083: cd 80 int $0x808048085: b8 01 00 00 00 mov $0x1,%eax804808a: cd 80 int $0x80
Too Binary… (is not Printable)
orz
Binaryを使わずにx86を実行できるか?
00000000 2540404040 and eax,0x4040404000000005 2521212121 and eax,0x212121210000000A 2D2D213D3D sub eax,0x3d3d212d0000000F 2D2A7D3B3B sub eax,0x3b3b7d2a00000014 2D233E7B7B sub eax,0x7b7b3e2300000019 2D25607B7B sub eax,0x7b7b60250000001E 60 pushad0000001F 5B pop ebx00000020 5E pop esi00000021 5F pop edi00000022 5E pop esi00000023 5B pop ebx00000024 5E pop esi00000025 5F pop edi00000026 2540404040 and eax,0x404040400000002B 2521212121 and eax,0x2121212100000030 2D2D2D2D2D sub eax,0x2d2d2d2d00000035 2D287E2A2A sub eax,0x2a2a7e28
できた!
10
しかも10文字だけでx86プログラムを実行
char main[]="`%[_-]%-```%`-_-`[_][_]_[-_,`~-~#-[-~]#_-)]%_-`]%``_____""___-[)[`-)[,]-[])_-#,~%-~]~]`]]]]]]]]),_-`#,#-)`,]--[#[-)`%~--]%~`]_""][][_-)~[_-~_-)-_%~,--`]--]-_-`[[[[]]]-)%#)-~]~--[#~--##-~-[~~~`_][_""[_]-_`_]-%~%#-~#,--#[#`-[[-%`_]___][-_-,_-[]-~-_]_--__-~-~__%`[_][_]""[-_`~%-)`#)-_``)-[_#%-]_%``]__[][]-_#`)-#]~~-,-__-`-~~--~_,`]][_[_[-""_%%]-,[[,--%]--,##,-,%#[`[[_[]_]-]_,#-]#[%-~]`,-)~~--~``-`[][[[][-]#""]%-)_[#-%]%#-##,[-#-%``[]_]][_-)%[#--~)`-#-~,-~)`#--)~%`___]_]]-`-_%""-``#%-,~#--~)#--]~#-`][[]]]]-[#_--_)#%--#---#~_~-[~])`_]_____--)[#-[""_`--,%~,-))`--#)~~`][]]]]_-~--,-]_]~-~-~%-)-_)-~]~%`__[_]_[-]#%`-~#-""#-##)--%#],-%))#`_]]]_[[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,";
# % - ) ,[ ] _ ` ~
名付けて Brain-f*ck-f*ck(仮)
demo : Hello, world ! (32bit Linux x86)
10 characters only !
0x20 0x30 0 0x40 @ 0x50 P 0x60 ` 0x70 p0x21 ! 0x31 1 0x41 A 0x51 Q 0x61 a 0x71 q0x22 ' 0x32 2 0x42 B 0x52 R 0x62 b 0x72 r0x23 # 0x33 3 0x43 C 0x53 S 0x63 c 0x73 s0x24 $ 0x34 4 0x44 D 0x54 T 0x64 d 0x74 t0x25 % 0x35 5 0x45 E 0x55 U 0x65 e 0x75 u0x26 & 0x36 6 0x46 F 0x56 V 0x66 f 0x76 v0x27 ' 0x37 7 0x47 G 0x57 W 0x67 g 0x77 w0x28 ( 0x38 8 0x48 H 0x58 X 0x68 h 0x78 x0x29 ) 0x39 9 0x49 I 0x59 Y 0x69 i 0x79 y0x2A * 0x3A : 0x4A J 0x5A Z 0x6A j 0x7A z0x2B + 0x3B ; 0x4B K 0x5B [ 0x6B k 0x7B {0x2C , 0x3C < 0x4C L 0x5C ¥ 0x6C l 0x7C |0x2D - 0x3D = 0x4D M 0x5D ] 0x6D m 0x7D }0x2E . 0x3E > 0x4E N 0x5E ^ 0x6E n 0x7E ~0x2F / 0x3F ? 0x4F O 0x5F _ 0x6F o
言語仕様書(x86命令の10個の記号だけ)
% 25 and eax,XXXXXXXX- 2D sub eax,XXXXXXXX# 23 and ebp,[edi+ebx*2]) 29 sub [edi+ebx*2],ebp, 2C sub al,XX` 60 pushad[ 5B pop ebx] 5D pop ebp_ 5F pop edi~ 7E jne(jng) XX
問題
ADD命令すら呼べない。MOVも実行できない
どうする?
乱数で生成した記号バナリを逆ゕセ
00000000 293D2B283A5B sub [dword 0x5b3a282b],edi00000006 2C2A sub al,0x2a00000008 2821 sub [ecx],ah0000000A 3E283B sub [ds:ebx],bh0000000D 60 pushad0000000E 3D3B7C2F7C cmp eax,0x7c2f7c3b00000013 5F pop edi00000014 60 pushad00000015 2B3E sub edi,[esi]00000017 5F pop edi00000018 2B7D21 sub edi,[ebp+0x21]0000001B 5E pop esi0000001C 3C2B cmp al,0x2b0000001E 3F aas0000001F 5D pop ebp00000020 7B25 jpo 0x4700000022 2D295B7B2E sub eax,0x2e7b5b2900000027 3C23 cmp al,0x2300000029 5C pop esp
使えそうな命令を探す
0x60 PUSHAD (`)
Temporary = ESP;Push(EAX);Push(ECX);Push(EDX);Push(EBX);Push(Temporary);Push(EBP);Push(ESI);Push(EDI);
60 PUSHA Push AX, CX, DX, BX, original SP, BP, SI, and DI.60 PUSHAD Push EAX, ECX, EDX, EBX, original ESP, EBP, ESI, and EDI.
0x61 POPAD (’a’) oh! Alphabet…
//Instruction == POPAD_ EDI = Pop();^ ESI = Pop();] EBP = Pop();¥ ESP = ESP + 4; //skip next 4 bytes of stack[ EBX = Pop();Z EDX = Pop();Y ECX = Pop();X EAX = Pop();
61 POPA Pop DI, SI, BP, BX, DX, CX, and AX. 61 POPAD Pop EDI, ESI, EBP, EBX, EDX, ECX, and EAX.
使えるレジスタに制限がある
58 pop eax; X59 pop ecx; Y5A pop edx; Z5B pop ebx; [5C pop esp; ¥5D pop ebp; ]5E pop esi; ^5F pop edi; _
AND SUB PUSHAD POP x 7
00000000 2540404040 and eax,0x4040404000000005 2521212121 and eax,0x21212121
0000000A 2D2D213D3D sub eax,0x3d3d212d0000000F 2D2A7D3B3B sub eax,0x3b3b7d2a00000014 2D233E7B7B sub eax,0x7b7b3e2300000019 2D25607B7B sub eax,0x7b7b6025
0000001E 60 pushad0000001F 5B pop ebx00000020 5E pop esi00000021 5F pop edi00000022 5E pop esi00000023 5B pop ebx00000024 5E pop esi00000025 5F pop edi
PUSH dword 0x???????? 相当のx86コード
一番の問題は…
スタック上に置いたコードにジャンプする方法がない!!!
FF D4 call espFF E4 jmp espFF D4 call espFF D0 call eaxC3 ret
メモリへの書き込みは AND と SUB のみで
23 2C 5F and ebp,[edi+ebx*2]# , _
29 2C 5F sub [edi+ebx*2],ebp) , _
実際に使えるレジスタも ebp, edi, ebx の3つなど制限がある。
→自己書き換え
(省略)
Perl ンタプリタが起動するデモ(省略)
まとめ
顔文字 [^_^]
x86
Programming
記号プログラミングのススメ
使用するのは記号32文字のみ
!”#$%&’()-=^~¥|`@
{ [ ] } ; + : * <> , . / ? _ |
スペース、タブ、改行も使わない
メリット
ンデントに悩む必要なし
1,2,3,4,8スペース、1タブ派の人も安心
変数の命名に悩む必要なし
_ __ ___ ____ _____ ______ _______
顔文字系 x86 プログラミングのススメ
NASM が存在しない環境でも…
直接キー入力で実行可能
ゕセンブラなんて不要
コンパルフェーズなし
コピペで量産可能
US-ASCII の範囲なので大丈夫!
バナリエデゖタ不要
スクリーンエデゖタすら不要
本当のプログラマは /dev/tty で(ry
顔文字系プログラミングのススメ
ソースコードがいつも笑顔!
[^_^[^_^
癒される!
[^_^[^_^
読みにくいコードで職を守る!
[^_^[^_^
純粋に楽しい!
[^_^[^_^
Fun of the programming
58
一生涯 顔文字プログラマー 宣言
たとえ、ゕルフゔベットのキーが壊れても、記号のキーだけあればプログラミングできる!
バイナリアン
はもう古い
ASCII 文字で
プログラミング
しかも
10文字
だけで
# % - ) ,[ ] _ ` ~
ね、簡単でしょ?
all your base10 are belong to us
,[^_^]/~